2012-06-22 180 views
2

我有一个基于ruby on rails的web应用程序,它使用this延迟作业宝石。Rails - 延迟完成作业

我有一个触发延迟工作的功能,这又会触发其他几个延迟工作。有没有办法,窝情况是一个事件,可以表明所有与父母有关的工作已经完成?或者,当我尝试检索文档时,是否需要处理任何可用的数据?

例子:

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 

回答

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。

Job.where(parent_id: @parent.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 

那么你可以通过检查子作业