我在应用程序中使用Rails 5.2,在处理后台作业时使用sidekiq。
class Document < ApplicationRecord
has_many :document_jobs
end
class DocumentJob < ApplicationRecord
belongs_to :document
def self.create_document_job(document, status, details)
document.document_jobs.create(status: status, details: details, user_id: user_id)
end
def self.update_document_job(document_job, status, details)
document_job.update(status: status, details: details)
end
end
我想让Document作业模型中的当前用户存储在db中。
我正在所有Sidekiq工作人员中调用create_document_job方法
class DocumentWorker
include Sidekiq::Worker
def perform(*args)
document = Document.find_by_name("sample")
document_job = DocumentJob.create_document_job(document, "processing", "job details")
rescue StandardError => e
DocumentJob.create_document_job(document_job, "failed", "job error details")
end
end
在DocumentJob模型的create_document_job方法中创建文档作业时,我想获取当前的用户ID。如何获取并存储它?
答案 0 :(得分:2)
您无法在工作中从Devise访问current_user
。因此,将其作为参数从您的工作位置发送。
此外,Sidekiq使用的Redis仅包含键值对。因此,不要传递用户对象,而是传递用户ID,然后在工作中就可以@user = User.find(user_id)
答案 1 :(得分:0)
我建议将user_id作为参数传递给作业,因为,如我所见,首先,您只需要user_id;第二,它比传递完整的加载对象轻,这可以如果在队列数据库(例如Redis)中存储许多作业,效率会降低。
如果您需要加载用户对象,仍然可以通过调用以下命令在工作中完成它:
user = User.find user_id