如何为使用Sidekiq的工人设置纸质记录Whodunnit

3
我正在尝试实现以下功能:当在worker内更新具有paper trail的模型时,必须使用“worker”设置whodunnit。我尝试了很多方法都没有成功,最后一次尝试是尝试在github thread中找到的解决方案。问题是我有一些带有1个或多个参数的perfom工作进程(我已更改此设置为PaperTrail.request.whodunnit = 'worker')。

如何在每个perform之前或周围设置whodunnit,以便版本中的whodunnit保存为whodunnit:worker?

我的worker看起来像这样:

module ModuleName
  module Workers
    class WorkerClass
      include Sidekiq::Worker

      sidekiq_options queue: 'default', retry: true


      def perform # here with none, 1 or more params
        # update some model
      end
    end
  end
end

1个回答

3

对我来说的解决方案

base_worker.rb

class BaseWorker
  extend ActiveModel::Callbacks
  define_model_callbacks :perform

  around_perform :set_paper_trail_whodunnit

  def set_paper_trail_whodunnit
    PaperTrail.request.whodunnit = "worker-#{self.class.name}"
    yield
    PaperTrail.request.whodunnit = nil
  end

  def perform(*args)
    run_callbacks(:perform) do
      perform!(*args)
    end
  end

  def perform!(*_args)
    raise 'Missing your #perform! method implementation'
  end
end

工作人员:
module ModuleName
  module Workers
    class WorkerClass < ::BaseWorker
      include Sidekiq::Worker

      sidekiq_options queue: 'default', retry: true


      def perform! # here with none, 1 or more params
        # update some model
      end
    end
  end
end

你可能想把whodunnit = nil放在一个ensure块中,以防出现异常。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接