我在从另一个模型内以及在对象模型中更改对象时遇到问题。我有以下型号:
class Foo < ActiveRecord::Base
has_many :bars
def do_something
self.value -= 1
# Complicated code doing other things to this Foo
bars[0].do_other
save!
end
end
class Bar < ActiveRecord::Base
belongs_to :foo
def do_other
foo.value += 2
foo.save!
end
end
如果我有一个Foo
对象,value
设置为1,并在其上调用do_something
,我可以从我的数据库日志中看到以下两个操作:
Foo Update (0.0s) UPDATE "foos" SET "value" = 2 WHERE "id" = 1
Foo Update (0.0s) UPDATE "foos" SET "value" = 0 WHERE "id" = 1
...所以do_something可能是缓存self
对象。我可以避免这种情况,除了移动save!
s?
答案 0 :(得分:2)
ActiveRecord提供了一种reload
方法,用于从数据库重新加载模型对象的属性。此方法的源代码是:
# File vendor/rails/activerecord/lib/active_record/base.rb, line 2687
def reload(options = nil)
clear_aggregation_cache
clear_association_cache
@attributes.update(self.class.find(self.id, options).instance_variable_get('@attributes'))
@attributes_cache = {}
self
end
- 你可以看到它调用一个clear_association_cache
方法,所以肯定会有一些关联的缓存可以解释你所看到的行为。您可能应该在保存之前使用其中一种方法重新加载模型。