我正在尝试计算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表中缓存必要的产品数据,我还可以。
谢谢!
答案 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