Да, я считаю, что это последовательное поведение, потому что тот экземпляр вашей модели, который был только что создан, не был перезагружен. Поэтому «измененные» атрибуты не были сброшены.
Извините, если это не очень четкое объяснение. Чтобы продемонстрировать, запустите отладчик в вашем методе 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.
Надеюсь, что имеет смысл: -)