我正在为结帐流程进行送货实施。
我的应用程序具有购物车,购物车商品,订单和订单商品。
所有物品的重量和大小都在数据库中,我在订单和购物车模型中计算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
)
我没有尝试,但是我认为它应该可以工作:)