2017-07-18 171 views
0

我在延迟工作添加PDF生成任务像下面如何处理环路延迟工作

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

这工作得很好,但它需要像2分钟遍历所有聘用过的员工和他们的详细资料,并完成请求。

我该如何缩短这个时间?或者我如何添加循环延迟作业。我现在的生成PDF类

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 
+0

你能不能传递GeneratePdf的执行动作里面的delayed_job和循环内的员工? –

+0

是的,但是在那种情况下,整个循环立即运行,并且所有的pdf都是一次生成的,因为整个事物只被视为一个工作。它虽然没有帮助 – asdfkjasdfjk

回答

2

首先,我假设你@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