Есть ли разница между:
after_create :after_create
и after_commit :after_commit_on_create, :on => :create
Можно ли их использовать взаимозаменяемо?
Есть ли разница между:
after_create :after_create
и after_commit :after_commit_on_create, :on => :create
Можно ли их использовать взаимозаменяемо?
Они не взаимозаменяемы. Основное различие заключается в том, когда выполняется обратный вызов. В случае after_create
это всегда будет перед вызовом save
(или create
).
Rails обертывает каждый save
внутри транзакции, а в этой транзакции запускаются обратные вызовы до/после (это связано с тем, что при возникновении исключения в after_create сохранение будет отменено). С after_commit
ваш код не запускается до тех пор, пока не будет совершена самая удаленная транзакция. Это могут быть созданные рельсы транзакций или созданные вами (например, если вы хотите внести несколько изменений внутри одной транзакции).
В момент, когда after_save/create
выполняется, ваше сохранение все равно может быть отменено и (по умолчанию) не будет видимым для других подключений к базе данных (например, фоновая задача, такая как sidekiq). Некоторая комбинация этих 2 обычно является мотивацией для использования after_commit
.
Существует одно существенное различие между этими двумя в отношении ассоциаций. after_create вызывается, как только запрос на вставку запускается для данного объекта и перед запросами вставки ассоциаций объекта. Это означает, что значения связанных объектов могут быть изменены непосредственно в обратных вызовах after_create без запроса на обновление.
class Post < ActiveRecord::Base
has_one :post_body
after_create :change_post_body
def change_post_body
self.post_body.content = "haha"
#No need to save
end
end
Рельсы 5
Вы можете использовать after_create_commit :method_name
только для вызова этого обратного вызова при создании.
Предупреждение
Использование в after_create_commit
и той же модели after_create_commit
и after_update_commit
позволит только последнему определенному after_create_commit
after_update_commit
вступить в силу и переопределит все остальные.
Источник: https://guides.rubyonrails.org/active_record_callbacks.html