2

我有一个基于 ruby​​ on rails 的 Web 应用程序,它使用了这个延迟的工作 gem。

我有一个触发延迟作业的功能,该功能又会触发其他几个延迟作业。有没有办法,嵌套案例是一个可以指示与父级相关的所有作业都已完成的事件?或者当我尝试检索文档时,我是否只需要处理可用的任何数据?

例子:

def create_vegetable
#..... creates some vegetable
end

def create_vegetable_asynchronously id
  Farm.delay(priority: 30, owner: User.where("authentication.auth_token" => token).first, class_name: "Farm", job_name:create "create_vegetable_asynchronously").create_vegetable(id)
end

def create_farm_asynchronously data
  data.each do |vegetable|
    create_vegetable_asynchronously vegetable.id
  end
end

handle_asynchronously :create_farm_asynchoronously
4

1 回答 1

3

可能有点矫枉过正,但您可以明确地分层组织您的工作,并在挂钩之前使用将父工作 ID 传递给子任务。就像是:

class Job < Delayed::Job
  belongs_to :parent, class: 'Job' #also add db column for parent_id
end

class CreateVegetable 

   def initialize(id)
     @id = id
   end

   def perform
     Farm.create_vegetable(id)
   end

end


class CreateFarm 
   def initialize(vegetable_ids,owner_id)
     @vegetable_ids = vegetable_ids
     @owner_id = owner_id
   end

   def before(job)
     @job_id = job.id
   end

   def perform
     @vegetable_ids.each { |id| Job.enqueue CreateVegetable.new(id), priority: 30, owner_id = @owner_id, :parent_id = @job_id }
   end

end

然后,当您启动创建农场时,以某种方式记住作业 ID。

def create_farm_asynchronously data
   owner_id = User.where("authentications.auth_token" => token).first.id
   @parent = Job.enqueue CreateFarm.new(data.map(&:id), owner_id)
end

然后您可以通过以下方式检查子作业:

Job.where(parent_id: @parent.id) 
于 2012-06-22T10:46:35.020 回答