Подтвердить что ты не робот

After_create: foo vs after_commit: bar,: on =>: create

Есть ли разница между:

after_create :after_create и after_commit :after_commit_on_create, :on => :create

Можно ли их использовать взаимозаменяемо?

4b9b3361

Ответ 1

Они не взаимозаменяемы. Основное различие заключается в том, когда выполняется обратный вызов. В случае after_create это всегда будет перед вызовом save (или create).

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

В момент, когда after_save/create выполняется, ваше сохранение все равно может быть отменено и (по умолчанию) не будет видимым для других подключений к базе данных (например, фоновая задача, такая как sidekiq). Некоторая комбинация этих 2 обычно является мотивацией для использования after_commit.

Ответ 2

Существует одно существенное различие между этими двумя в отношении ассоциаций. 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

Ответ 3

Рельсы 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