ruby-on-rails - after_create 回调中的 ActiveJob::DeserializationError - 未找到记录
问题描述
在 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
?
解决方案
您应该使用after_commit
而不是after_create
. 这是因为
after_create - 在 Model.save 之后调用尚未保存的新对象(不存在记录)。在 的情况下
after_create
,这将始终在保存(或创建)调用返回之前。Rails 将每个保存都包装在事务中,并且创建前后的回调在该事务中运行。after_commit - 在数据库事务完成后调用。使用
after_commit
,您的代码在提交最外层事务之后才会运行。
推荐阅读
- javascript - 选择下拉菜单时自动填充文本框
- algorithm - 被编码测试难倒-令人发指的问题-请提出建议
- c++20 - 将 libfmt 与旧版 API 一起使用
- cumulocity - 使用 Angular cli 时代理到 Cumulocity 租户
- python - 在 PyTorch Lightning 中运行多个模型的问题
- reactjs - Formik,是的,formik-material-ui 注册表单在单击表单时显示电子邮件错误
- php - PHP:在 5.2.5 中需要 json_encode() 5.4 功能
- mysql - 相关子查询总是引发错误,找不到原因
- xml - 需要从另一个 XML 文件元素中获取属性值
- python - 循环遍历python变量