假设我有两种模式:
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
?
答案 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并阻止保存继续进行。