Search code examples
ruby-on-railsrubydelayed-job

Get job id on called method from job


I'm trying to get the job which starts an action in this particular action.

Let me explain.

class MyClass
  def go_for_it(delay = true)
    if delay
      delay(run_at: 2.minutes.from_now).go_for_it(false)
    else
      # How can I know if I was called by a DelayedJob AND if yes, which one ?
      puts "I'll do it"
    end

  end
end


my_class = MyClass.new
my_class.delay(run_at: 2.minutes.from_now).go_for_it

My aim here is to make restrictions on jobs creation. I don't want go_for_it method called twice but this method can delay again itself according to some reasons. If I add those lines to go_for_it:

calling_method = caller_locations[0].label
job = Delayed::Job.where(queue: "my_queue").first
puts job.payload_object.id
# => id of MyClass if recorded
puts job.payload_object.method_name
# => :go_for_it

In the case of go_for_it delaying itself, these data are not enough because job variable can be itself and then it's not a second different call of got_for_it. It's just itself delayed again.

What I need to know here is which job call run or invoke_job on go_for_it method.


Solution

  • If I'm understanding well, you need to know which job is actually running.

    You can use a custom job with a before hook to do an action before running the job, also you'll have totally access to job object at this moment.

    Example :

    class MyClassJob
      def initialize(my_object: MyClass.new)
        @my_object = my_object
      end
    
      def before(job)
        binding.pry
        another_job = Delayed::Job.where(queue: "my_queue").where('id <> ?', job.id)
      end
    
      def perform
        @my_object.go_for_it
      end
    end
    
    MyClassJob.new().delay.perform