我正在使用rails 3.0开发礼品注册表应用。该应用程序允许多个客人捐赠礼物。在显示礼物时,我需要显示剩余的金额,如果已经给出总金额,我需要显示购买的物品。
对于表现,我想要对总贡献的总和以及项目的状态进行去标准化。
看起来很简单,但是当我试图弄清楚如何以完全封装的方式将其放入模型中,并且在所有情况下都能工作时,事情变得比我预期的要复杂得多。
我尝试了一些不同的方法,包括对项目和贡献之间的关联进行回调,但最终结果是对贡献对象的回调。
item.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
order.rb
class Order < ActiveRecord::Base
has_many :contributions, :inverse_of => :order, :dependent => :destroy
end
contribution.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
这似乎适用于我需要的情况,但感觉不对。
首先,我必须手动更新destroy回调中的contrib关联这一事实看起来很奇怪。
此外,只有在持久保存对象时才能正确更新去标准化值。
所以问题是,我怎样才能做得更好,这种情景的最佳做法是什么?