使用未保存的关联

时间:2010-03-08 21:35:34

标签: ruby-on-rails activerecord

假设我有两种模式:

class Model1 < ActiveRecord::Base
  has_many :model2

  def save
    self.attr = <sth. complex involving the associated model2 instances>
    super
  end
end

class Model2 < ActiveRecord::Base
  belongs_to :model1
end

覆盖的save方法中的语句将发出一个复杂的查询(使用find [或者命名的范围])来计算某些关联的Model2实例的某些聚合值。问题是当一个新的Model1实例和一些Model2实例时,该查询在创建对象后不会在第一个save上返回任何内容,并将为所有连续的{{返回旧数据(上一代) 1}}操作。

有没有办法在非持久的内存中状态使用save

1 个答案:

答案 0 :(得分:6)

当然:它被称为#select,或#inject,或任何其他方法:

class Model1 < ActiveRecord::Base
  has_many :model2

  before_save :update_aggregate_value

  private
  def update_aggregate_value
    # returns sum of unit_value for all active model2 instances
    self.attr = model2.select(&:active?).map(&:unit_value).sum
  end
end

class Model2 < ActiveRecord::Base
  belongs_to :model1
end

请记住,在这种情况下,数据库将被命中,除非尚未加载model2实例。另外,请注意我使用了before_save回调,而不是覆盖#save。这是“更安全”,因为您可以返回false并阻止保存继续进行。