我的订单模型has_many 销售。销售包含“价格”列,订购“总价”列。
典型的订单如下所示:
订单记录:
- >销售ID:1,价格:5
- >销售ID:2,价格:5
- >销售ID:3,价格:5
现在我想将销售价格保存到订单模型(在这种情况下应该是totalprice = 15)。在我的销售模型中,我得到以下内容:
class Sale < ActiveRecord::Base
belongs_to :order
before_create :totalprice
def totalprice
@sales.each_with_index do |s, index|
@totalprice += s.price
end
@totalprice = @order.totalprice
end
所以,我想循环销售并添加价格。结果应保存到Order.totalprice。
你的方法是什么?我甚至无法将任何保存到表中并得到几个(不同的)错误。所以我想我的方法从头开始是错误的。
提前致谢!
答案 0 :(得分:4)
an ActiveRecord method called sum可能是你应该使用的。例如,如果您的关系已经建立,您可以简单地写一个这样的行来获得总价:
@order_instance.sales.sum( :price )
不是将它作为数据库中的实际列(我通常认为它是一个禁止,持久的派生字段回到记录中),我建议创建一个包含上述代码的实例方法。所以,在Order模型中:
def totalprice
self.sales.sum( :price )
end
这将允许您始终访问适当的值,并在每次添加,删除或更新Sale对象时消除更新记录的麻烦。
<强>附录:强>
如果您担心进行多个冗余查询,或者在处理订单时更改基础数据,您可能还希望将查询提取到实例变量中,以便它只运行一次:
def totalprice
@total_price ||= self.sales.sum( :price )
end
答案 1 :(得分:1)
如果您想获得订单中所有销售商品价格的总和,您可以按订单模式执行此操作
def total_price
sales.to_a.sum { |item| item.price }
end
您可以通过在订单型号
的实例上调用@ order.total_price来获取总价