计算Rails中的订单总数

时间:2013-09-08 02:44:30

标签: ruby-on-rails-4

我正在尝试计算Rails中的订单模型中的总计并且遇到一些麻烦。讨论here有帮助,但并不完全适用于我的情况。

基本上,用户可以选择添加到订单中的产品,然后保存为order_products。我有以下模型(仅提到相关字段):

#products table has fields name, price
class Product 
end 

#orders table has field total
class Order
  has_many :order_products
  accepts_nested_attributes_for :order_products
end

#orderproducts table has fields order_id, product_id, qty
class OrderProduct
  belongs_to :order
  belongs_to :product
end

对项目进行总结以创建订单总计的最佳方法是什么?显然,你不能只是在订单表格中传递隐藏字段,因为有人可以操纵它。我正在考虑做这样的事情:

class Order
  has_many :order_products
  accepts_nested_attributes_for :order_products
  before_save :calc_total

  def calc_total
    self.total = order_products.product.sum(&:price)
    #or should this be order_products.sum(&product.price) or similar?
  end 
end

但这看起来不像正确的语法。也许我不能使用'sum'函数,应该只是遍历order_products并查看Product模型的价格?当然这是一个非常常见的情况 - 我是以正确的方式进行的吗?

另外,鉴于产品价格可能会发生变化,最好还是在订单时将每种产品的价格存储在订单产品表中?在这种情况下,我只是在OrderProduct模型中添加另一个before_save函数,从Product模型中查找当前价格,将其乘以qty并保存为product_total值?

最后,如果产品被删除,当有order_products引用它时会发生什么?这会引起问题吗?或者,如果我在订购时在order_products表中缓存必要的产品数据,我还可以。

谢谢!

1 个答案:

答案 0 :(得分:0)

我已经使用了以下内容,不确定它是否是最佳方式

def calc_totals
  self.total = 0
  order_products.each do |op|
    self.total += op.product.price * op.qty
    op.item_price = op.product.price
    op.item_total = op.product.price * op.qty
  end
end