一个非常常见的模式是在关联的父模型中具有属性来自子项的某些摘要/聚合值,例如,总计或平均值或某些此类事物。典型的:
class Order < ActiveRecord::Base
has_many :items
# total_cost
end
class Item < ActiveRecord::Base
belongs_to :order
# cost
end
每次添加或删除Item
时,都希望更新父级total_cost
。当然,也可能Item
的费用可能会发生变化,在这种情况下,total_cost
也需要更新。
我无法找到一个非常好的最佳实践指南,我已经看到它做了很多不同的方式。
我想,基本问题是谁应该负责保持total_cost
价值?在我看来,它确实需要是Item
(除非Items
一旦与父母联系在一起,它们就是不可变的。)
最好的方法是after_save
上的after_destroy
和Item
回调调用Order
中更新其total_cost
的方法吗? / p>
答案 0 :(得分:0)
是的,如果您必须在数据库中保存total_cost并将其更新,那么最好的方法是在项目上进行after_save
和after_destroy
回调,这将更新订单的total_cost。
顺便说一下,你也可以通过在Order模型中定义一个方法来计算total_cost
而不将其保存在Database.Like以下
class Order < ActiveRecord::Base
has_many :items
def total_cost
return self.items.sum(:cost)
end
end
通过这种方式,您不需要任何回调。您可以将其作为订单模型中的字段进行访问。此外,您无需担心项目更新删除或添加新项目。您也不必将其保存在数据库表中。