Разница между after_create, after_save и after_commit в обратных вызовах rails

Разница между after_create, after_save и after_commit в Rails заключается в том, что:

  • after_save вызывается при создании и обновлении объекта
  • after_commit вызывается при создании, обновлении и уничтожении.
  • after_create вызывается только при создании объекта

Это единственное различие между ними или есть другие существенные различия?

Ответ 1

Вы почти все поняли. Однако существует одно существенное различие между after_commit и after_create или after_save т.е.

В случае after_create это всегда будет перед вызовом сохранения (или создания) возврата.

Rails обертывает каждую сохраненную транзакцию, а в этой транзакции запускаются обратные вызовы до/после (это следствие того, что если в post_create возникает исключение, то сохранение будет отменено). С after_commit ваш код не запускается до тех пор, пока не будет совершена самая внешняя транзакция. Это могут быть созданные рельсы транзакций или созданные вами (например, если вы хотите внести несколько изменений внутри одной транзакции). Первоначально опубликовано здесь

Это также означает, что если after_commit вызывает исключение, транзакция не будет after_commit.

Ответ 2

С заказом обратных звонков

after_create -

Вызывается после Model.save для новых объектов, которые еще не были сохранены (запись не существует)

after_save -

Вызывается после Model.save (независимо от того, создается ли это или обновляется или сохраняется)

after_commit -

Вызывается после завершения транзакции базы данных.