我正在使用 rails 3.0 开发礼品注册表应用程序。该应用程序允许多个客人为礼物捐款。在展示礼物时,我需要显示剩余金额,如果已支付总金额,我需要显示已购买的物品。
对于性能,我想对总贡献的总和以及项目的状态进行非规范化。
看起来很简单,但是当我试图弄清楚如何以一种完全封装的方式将它放入模型中并且在所有情况下都可以工作时,事情变得比我预期的要复杂得多。
我尝试了几种不同的方法,包括对项目和贡献之间的关联进行回调,但最终以对贡献对象的回调结束。
项目.rb
class Item < ActiveRecord::Base
# decimal amount
# decimal total_contributed
# boolean purchased
has_many :contributions, :inverse_of => :item
def set_total_contributed
self.total_contributed = 0
contributions.each do |cont|
self.total_contributed += cont.amount
end
purchased = self.total_contributed >= amount
end
end
订单.rb
class Order < ActiveRecord::Base
has_many :contributions, :inverse_of => :order, :dependent => :destroy
end
贡献.rb
class Contribution < ActiveRecord::Base
belongs_to :item, :inverse_of => :contributions
belongs_to :order, :inverse_of => :contributions
after_create do |cont|
item.set_total_contributed
item.save
end
after_destroy do |cont|
item.contributions.delete(cont)
item.set_total_contributed
item.save
end
end
这似乎在我需要它的情况下工作,但感觉不对。
首先,我必须在销毁回调中手动更新贡献关联的事实似乎很奇怪。
此外,仅当对象被持久化时,非规范化值才会正确更新。
所以问题是,我怎样才能做得更好,这种情况的最佳实践是什么?