ActiveJob :: DeserializationError в обратном вызове after_create - запись не найдена - PullRequest
0 голосов
/ 14 февраля 2020

В приложении Rails 6 у меня есть следующий код:

class Reservation < ApplicationRecord
  after_create     :publish_creation

  def publish_creation
    Publishers::Reservations::CreateJob.perform_later(self)
  end
end

class Publishers::Reservations::CreateJob < ApplicationJob
  queue_as :default

  def perform(reservation)
    puts reservation.inspect #dummy code for testing
  end
end

В большинстве случаев я создаю Reservation (запись всегда создается в БД), я получаю ошибку ниже

2020-02-14T09: 54: 03.707Z pid = 81787 tid = 1xmj ПРЕДУПРЕЖДЕНИЕ: ActiveJob::DeserializationError: Error while trying to deserialize arguments: Couldn't find Reservation with 'id'= 35651cf7-35bc-4da0-bb0d-6285ac093d22

При первом запуске Sidekiq для обработки задания всегда находит Reservation и все работает нормально.

Reservation id: "35651cf7-35bc-4da0-bb0d-6285ac093d22", analysis_id: "6b3b167b-1279-49c0-991a-b580c375fd0f", reservable_type: "User", reservable_id: "94f60c16-29d4-4372-983b-7544c393a7e6", reserved_between: 2020-02-10 08:00:00 UTC..2020-02-10 08:10:00 UTC, state: "scheduled", created_at: "2020-02-14 10:02:28", updated_at: "2020-02-14 10:02:28"

Я что-то здесь упускаю? Связано ли это с тем, что я работаю в режиме development, и оно должно исчезнуть после перехода на production?

1 Ответ

4 голосов
/ 14 февраля 2020

Вы должны использовать after_commit вместо after_create. Это потому, что

after_create - вызывается после Model.save для новых объектов, которые еще не были сохранены (записи не существует). В случае after_create это всегда будет до того, как вызов для сохранения (или создания) вернется. Rails обертывает каждое сохранение внутри транзакции, и внутри этой транзакции выполняются обратные вызовы до / после создания.

after_commit - Вызывается после завершения транзакции базы данных. С after_commit ваш код не запускается до тех пор, пока не будет завершена самая внешняя транзакция.

...