【问题标题】:Enqueue ActiveJob task with destroyed object将带有已销毁对象的 ActiveJob 任务排入队列
【发布时间】:2019-08-21 11:05:24
【问题描述】:

在控制器的操作中,我销毁了一条记录,然后将其作为参数传递给 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,带有默认异步活动适配器的开发环境。

【问题讨论】:

    标签: ruby-on-rails ruby rails-activejob


    【解决方案1】:

    当您使用ActiveRecord 对象调用.perform_later 时,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
    

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

    【讨论】:

      【解决方案2】:

      不要传递被破坏的post,而是传递它的idtitle

      # in the controller
      def destroy
        post = Post.find params[:id]
        post.destroy
        CleanUpJob.perform_later(post.id, post.title)
      end
      
      # in the job
      def perform(post_id, post_title)
        log_destroyed_content(post_id, post_title)
      end
      

      【讨论】:

        猜你喜欢
        • 2017-02-23
        • 1970-01-01
        • 2016-06-05
        • 2015-08-12
        • 1970-01-01
        • 2018-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多