我正在为结帐流程进行送货实施。

我的应用程序具有购物车,购物车商品,订单和订单商品。

所有物品的重量和大小都在数据库中,我在订单和购物车模型中计算total_weight。我也有一个shipping_service模型,其中每个运输服务都具有weightmin和weightmax,再加上postzone和land(国家/地区)模型。

现在,我想在购物车页面上仅显示符合购物车或订单重量的运输服务。

我想我的carts_controller应该是这样的:

class CartsController < ApplicationController
def show
    @cart = Cart.find(params[:id])
    @lands = Land.find(:all)
    @shippingservices = Shippingservice.where('@cart.total_weight BETWEEN ? AND ?', :weightmin, :weightmax)
end


我的购物车型号是:

class Cart < ActiveRecord::Base
  attr_accessor :total_weight

  has_many :cart_items
  has_many :products, :through => :cart_items
  has_many :lands
  has_many :shipping_services, :through => :postzones

  def total_weight
    cart_items.inject(0) {|sum, n| n.weight * n.amount + sum}
  end
end


我的土地模型是

class Land < ActiveRecord::Base
  has_many :shippingservices, :through => :postzones
  has_many :postzones
  has_many :carts
end


我的shipping_service模型是:

class Shippingservice < ActiveRecord::Base
  has_many :lands, :through => :postzones
  has_many :postzones
  has_many :carts
  has_many :orders
end


我的后区模型是:

class Postzone < ActiveRecord::Base
  belongs_to :shippingservice
  belongs_to :land
end


postzone表具有用于土地和shipping_services的外键。

最后,我想实现两个选择器字段:一个用于ship_to_countries,一个用于shipping_services,第二个选择器仅填充与在第一个选择器中选择的条目相关的条目。

我已经在carts_controller内部工作了:

@shippingservices = Shippingservice.includes(:lands, :postzones).where('postzones.land_id = ?', Land.first.id)


仅将特定国家/地区的运输服务加载到第二个选择器中。但是我不知道如何将相对于权重和后区的两个where子句组合到一个查询中。

很感谢任何形式的帮助!

先感谢您。

最佳答案

方法total_weight是在模型Cart中定义的红宝石方法

这样就无法在SQL语句中调用此方法。

您需要在SQL语句中计算总重量。

你应该尝试类似

@shippingservices = Shippingservice.joins(carts: :cart_items).where(
  '(cart_items.weight * cart_items.amount) BETWEEN ? AND ?', :weightmin, :weightmax
)


我没有尝试,但是我认为它应该可以工作:)

09-30 20:32