ruby-on-rails - 使用销毁的对象将 ActiveJob 任务排入队列

标签 ruby-on-rails ruby rails-activejob

在 Controller 的操作中,我销毁了一条记录,然后将其作为参数传递给 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_laterActiveRecord对象,ActiveJob将尝试将其序列化为 global 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

您需要确保从面向用户的查询中排除“软删除”记录。

关于ruby-on-rails - 使用销毁的对象将 ActiveJob 任务排入队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55435513/

相关文章:

ruby-on-rails - 使用 AWS Opsworks 设置环境变量

ruby-on-rails - 在 .erb 文件中使用 link_to,串联语法

ruby-on-rails - 使用文本文件构建页面 (Rails 2.3)

ruby-on-rails - 如何从sidekiq获取作业执行时间?

ruby-on-rails - Rails 作业生成器不工作

ruby-on-rails - 为什么 'rspec spec' 比 'bundle exec spec' 运行得更快并且使用的资源更少

ruby-on-rails - 为什么我们使用诸如solr, Elasticsearch 或任何其他搜索引擎之类的搜索引擎,却却拥有诸如ransack之类的事件记录 gem

ruby - Ruby 数据结构库的优化设计

ruby-on-rails - Mongoid::Document 是 GlobalID::ActiveJobs 的标识吗?

ruby-on-rails - Rails JOIN 模型依赖销毁