ActiveJob::DeserializationError 在 after_create 回调中 - 未找到记录
ActiveJob::DeserializationError in a after_create callback - Record Not Found
在 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 WARN:
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
它应该消失吗?
您应该使用 after_commit
而不是 after_create
。这是因为
after_create - Is called after Model.save on new objects that haven‘t been saved yet (no record exists). In the case of after_create
, this will always be before the call to save (or create) returns. Rails wraps every save inside a transaction and the before/after create callbacks run inside that transaction.
after_commit - Is called after the database transaction is completed. With after_commit
, your code doesn't run until after the outermost transaction was committed.
在 Rails 5+ 你可以使用 after_create_commit
(docs)
它会在创建事务之后 运行,所以记录已经被创建,但与 after_commit
不同的是它只会在 create
之后 运行,而不是在 update
也不 destroy
.
它是以下的别名:
after_commit :your_callback, on: :create
在 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 WARN:
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
它应该消失吗?
您应该使用 after_commit
而不是 after_create
。这是因为
after_create - Is called after Model.save on new objects that haven‘t been saved yet (no record exists). In the case of
after_create
, this will always be before the call to save (or create) returns. Rails wraps every save inside a transaction and the before/after create callbacks run inside that transaction.after_commit - Is called after the database transaction is completed. With
after_commit
, your code doesn't run until after the outermost transaction was committed.
在 Rails 5+ 你可以使用 after_create_commit
(docs)
它会在创建事务之后 运行,所以记录已经被创建,但与 after_commit
不同的是它只会在 create
之后 运行,而不是在 update
也不 destroy
.
它是以下的别名:
after_commit :your_callback, on: :create