2010-09-01 2 views
4

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

Является ли это ожидаемым поведением в Rails (2.3.8), или я делаю что-то неправильно?

+0

Можете ли вы разместить свой код после_создания? –

ответ

4

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

Извините, если это не очень четкое объяснение. Чтобы продемонстрировать, запустите отладчик в методе 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-запросе.

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