Проблемы с кешированием при обновлении объекта из другой модели - PullRequest
3 голосов
/ 22 февраля 2010

У меня проблема с внесением изменений в объект внутри другой модели, а также внутри модели объекта. У меня есть следующие модели:

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! с?

1 Ответ

2 голосов
/ 22 февраля 2010

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, поэтому определенно происходит кэширование ассоциаций, которые объясняют поведение, которое вы видите. Вам, вероятно, следует перезагрузить модель одним из ваших методов перед сохранением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...