去标准化轨道中关联对象的总和

时间:2012-08-23 14:50:59

标签: ruby-on-rails

我正在使用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关联这一事实看起来很奇怪。

此外,只有在持久保存对象时才能正确更新去标准化值。

所以问题是,我怎样才能做得更好,这种情景的最佳做法是什么?

0 个答案:

没有答案