1

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

基本上,用户可以选择添加到他们订单中的产品,然后保存为 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 表中,我可以吗?

谢谢!

4

1 回答 1

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
于 2013-09-08T17:51:21.580 回答