0

我正在使用 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

这似乎在我需要它的情况下工作,但感觉不对。

首先,我必须在销毁回调中手动更新贡献关联的事实似乎很奇怪。

此外,仅当对象被持久化时,非规范化值才会正确更新。

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

4

0 回答 0