Rails:为总和添加价格

时间:2016-01-11 13:25:57

标签: ruby-on-rails

我的订单模型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。

你的方法是什么?我甚至无法将任何保存到表中并得到几个(不同的)错误。所以我想我的方法从头开始是错误的。

提前致谢!

2 个答案:

答案 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来获取总价