2017-07-18 119 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