从另一个模型更新对象时缓存问题

时间:2010-02-22 11:58:12

标签: ruby-on-rails caching model

我在从另一个模型内以及在对象模型中更改对象时遇到问题。我有以下型号:

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?

1 个答案:

答案 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方法,所以肯定会有一些关联的缓存可以解释你所看到的行为。您可能应该在保存之前使用其中一种方法重新加载模型。