父对象的RAILS before_save回调在保存关联的子对象之前运行

时间:2017-05-26 09:05:21

标签: ruby-on-rails ruby-on-rails-4

我有一个类Car和一个类似于下面的类Part。这两个类都有一个属性'price'。现在汽车的价格是所有零件价格的总和。此外,如果没有价格的零件,即如果汽车的一个或多个零件的价格为零,那么汽车的价格将设为零。

Class Car 
  has_many :parts
  before_save :calculate_price

  private
  def calculate_price
    # calculate the price of car by summing all parts prices.
  end
end

Class Part
  belongs_to :car, inverse_of: parts
end

问题

每当零件的价格发生变化时,我想重新计算汽车的价格。现在为此我添加了一个before_save回调,但回调在部分对象保存之前运行,当我self.parts它从数据库加载部件对象而不是从内存加载它们因此我没有得到更新价格的价值。如何在保存关联的子对象后运行before_save或从内存加载子对象?

1 个答案:

答案 0 :(得分:0)

您还需要将回调放入Part模型,因为您想对零件的价格变化做出反应,对吧?类似的东西:

class Part
  before_save :update_car_price

  def update_car_price
    self.car.touch if self.car.present?
  end
end

未经过测试,但我认为touch应该足够了,您不必公开calculate_price的{​​{1}}。

警告:如果您对汽车和零件进行大量的价格更新,这可能会非常难看。