saved_change_to_attribute? всегда возвращает false при вызове внутри метода - PullRequest
1 голос
/ 25 февраля 2020

Итак, у меня есть after_update обратный вызов в модели ActiveRecord для уведомления внешней службы. Это следует вызывать, только если обновляется пара атрибутов. Поэтому я инкапсулировал вызовы saved_change_to_attribute? в методе, который затем используется в фильтре обратного вызова:

after_update :tell_service!, if: :update_for_service?

def update_for_service?
  saved_change_to_name? ||
  saved_change_to_city? 
end

Теперь update_for_service? всегда возвращает false, и я не понимаю, почему.

В консоли:

> p = Person.last
> p.name = 'Tom'
> p.save
true
> p.saved_change_to_name?
true
> p.update_for_service?
false

Что здесь происходит?

1 Ответ

0 голосов
/ 27 февраля 2020

Это связано с тем, что after_update выполняется в жизненном цикле обратного вызова. Этот ответ от pan.goth объясняет:

after_save, after_create, after_update вызываются в блоке транзакции, поэтому они будут выполнены перед выполнением SQL оператор.

Если вы хотите что-то сделать после завершения выполнения оператора, вы должны использовать after_commit callback.

...