如何处理延迟作业的循环

How to handle loop for delayed job

我在延迟作业中添加了 pdf 生成任务,如下所示

@employe.each do |em|
        em.details.each do |detail|
          Delayed::Job.enqueue GeneratePdf.new(detail)
        end
      end

这工作正常,但循环遍历所有雇员及其详细信息并完成请求大约需要 2 分钟。

我怎样才能减少这个时间?或者我怎样才能添加循环延迟作业。我当前生成的 pdf class

class GeneratePdf < Struct.new(:detail)
  def perform
    filename =  detail.id.to_s
    pdf = EmployeDetailsPdf.new(detail) #this generates a pdf
    pdf.render_file(filename + ".pdf")
  end
end

首先,我假设您的 @employe 变量应该被称为 @employees 并且只存储:几个员工

您通常应该只将对象的 ID 传递给作业。该工作将查询数据库以检索员工。时间再长一点也没关系,这就是工作的目的。

就这样,你把主要的工作负担交给了工作:

# some_controller
@employees.pluck(:id).each { |id| Delayed::Job.enqueue(id) }

# generate_pdf_job.rb
class GeneratePdf < Struct.new(:id)
  def perform
    employee = Employee.find(id)

    employee.details.each do |detail|
      pdf = EmployeDetailsPdf.new(detail)
      pdf.render_file(detail.id.to_s + ".pdf")
    end
  end
end