在创建新子项时更新父模型总计

时间:2015-10-25 23:54:04

标签: ruby-on-rails

我有一个包含很多销售的包装模型。

我想总结所有销售收入,并在每次新销售后更新套餐模型的总收入。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您想使用active record callback。我可能会使用after_create。您可以添加以下代码:

class Sale < ActiveRecord::Base
  belongs_to :package
  after_create :update_package_revenue

  def update_package_revenue
    package.update(total_revenue: package.sales.sum(:revenue)) # substitute the correct code here
  end
end

这使您可以在每次创建新销售时运行代码。

答案 1 :(得分:0)

实现这一目标的简单方法是使用以下设置:

class Package < ActiveRecord::Base
  has_many :sales

  def calculate_and_update_total_revenue
    update_attributes(:total_revenue, sales.sum(:revenue))
  end
end


class Sales < ActiveRecord::Base
  belongs_to :package
  after_create :update_parent_package

  private

  def update_parent_package
    package.calculate_and_update_total_revenue
  end
end

它为您提供了一个竞争条件抵抗方法来突破总数(您可以为每个新的销售添加+self.revenue,但之后您将修改全局来自多个执行上下文的状态。

但是,如果你写这样的逻辑,你最终会得到胖模型,真的很难在大型应用程序中管理。

如何使用mediator对象呢?