我需要访问sidekiq作业中的current_user。一种方法是在perform_async中传递current_user,但是因为在很多地方需要它,我想默认添加它。
所以我添加了一个服务器中间件,它将获取current_user登录并在Thread.current中设置它,这是我的中间件
class SidekiqServerMiddleware
def call(_worker, job, _queue)
set_current_user(job['args'])
yield
end
private
def set_current_user(args)
last_arg = args.last
return unless last_arg.is_a?(Hash) && last_arg.key?('current_user')
RequestStore.store[:current_user] = last_arg['current_user']
end
end
我正在使用RequestStore
以线程安全的方式设置Thread.current。
但是现在我要在perform_async调用中传递current_user
。我正在为sidekiq寻找一种开箱即用的方法,但找不到任何方法。
实现此目的的一种方法是为Sidekiq :: Worker
创建自定义模块module CustomSidekiqWorker
include Sidekiq::Worker
before_action set_current_user, only: :perform_async
def set_current_user
RequestStore.store[:current_user] = current_user.login
end
end
然后不包括Sidekiq::Worker
,而是包含CustomSidekiqWorker
。有更简洁的方法吗?也许我缺少一些ruby元编程。谢谢你的帮助。