ruby-on-rails - 将带有已销毁对象的 ActiveJob 任务排入队列
问题描述
在控制器的操作中,我销毁了一条记录,然后将它作为参数传递给 ActiveJob。
def destroy
post = Post.find params[:id]
post.destroy
CleanUpJob.perform_later post
end
在我的工作中,我需要对被破坏的记录进行一些清理操作。
def perform(post)
log_destroyed_content post.id, post.title
end
当我用 .perform_later 将其称为延迟时-它根本不执行。但是当我更改为 .perform_now - 它按预期工作。这个 Job 需要处理销毁和持久化的记录。
我正在使用lates Rails,带有默认异步活动适配器的开发环境。
解决方案
当你.perform_later
用一个ActiveRecord
对象调用时,ActiveJob
会尝试将它序列化为一个全局 id
您正在从数据库中删除您的记录,这意味着您的作业在运行时将找不到它。
您可以传递具有所有属性的哈希:
CleanUpJob.perform_later(post.attributes)
或者,您可以将模型标记为删除,并在实际完成记录后在作业中调用 destroy。将其视为首先软删除记录:
# in the controller
def destroy
post = Post.find params[:id]
post.update(state: :archived) # or whatever makes more sense for your application
CleanUpJob.perform_later(post.id, post.title)
end
# in the job
def perform(post_id, post_title)
log_destroyed_content(post_id, post_title)
post.destroy
end
您需要确保从面向用户的查询中排除“软删除”记录。
推荐阅读
- phpspreadsheet - 解析特定 csv 文件时出现异常“PhpOffice \ PhpSpreadsheet \ Reader \ Exception”
- r - R语言中的类多态等价
- sql - 如何在 FoxPro 中使用 SQL Select 添加一个不存在的 NULL 列?
- javascript - React.memo 行为
- unit-testing - 使用 Spock 测试时,无法在 Spring Boot 测试中连接 YAML 配置
- python - calibrateCamera 和 stereoCalibrate 的正确“对象点”应该是什么?
- sql - 用于删除最多 2 个条目的前导零的 SQL 查询
- python - 需要 K-Nearest Neighbors 算法解释
- php - CSS 不适用于包含的 PHP 文件
- css - Safari 扩展的内容 CSS 优先级问题