Обновление атрибута в обратном вызове после создания приводит к обновлению всей записи - PullRequest
5 голосов
/ 01 сентября 2010

В моем приложении Rails я пытаюсь обновить атрибут модели, используя update_attribute в обратном вызове after_create. Я могу успешно обновить атрибут, но по какой-то причине все остальные атрибуты модели также обновляются, когда я это делаю. Таким образом, хотя атрибут имени модели (например) не изменился, он задается (его текущему значению) в запросе на обновление базы данных.

Это ожидаемое поведение в Rails (2.3.8), или я делаю что-то не так?

1 Ответ

6 голосов
/ 01 сентября 2010

Да, я считаю, что это последовательное поведение, потому что тот экземпляр вашей модели, который был только что создан, не был перезагружен. Поэтому «измененные» атрибуты не были сброшены.

Извините, если это не очень четкое объяснение. Чтобы продемонстрировать, запустите отладчик в вашем методе after_create. Э.Г.

def my_after_save_callback
  require 'ruby-debug'; debugger
  update_attribute(:foo, "bar")
end

Затем при запуске отладчика запустите:

p self.changed

Будет возвращен массив всех атрибутов, которые были изменены для этого объекта. ActiveRecord обновит все эти атрибуты при следующем сохранении объекта.

Одним из способов решения этой проблемы является перезагрузка объекта перед обновлением атрибута.

def my_after_save_callback
  reload
  update_attribute(:foo, "bar")
end

Это приведет к сбросу «измененных» атрибутов, и только конкретный атрибут, который вы измените, будет обновлен в запросе SQL.

Надеюсь, что имеет смысл: -)

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