2

この遅延ジョブ gemを使用する ruby​​ on rails に基づく Web アプリケーションがあります。

遅延ジョブをトリガーする機能があり、それが他のいくつかの遅延ジョブをトリガーします。ネストケースは、親に関連するすべてのジョブが完了したことを示すことができるイベントですか? それとも、ドキュメントを取得しようとするときに、利用可能なデータで作業する必要がありますか?

例:

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

次に、create farmを起動するときに、どういうわけかジョブ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 に答える