2015-07-16 5 views
4

Я использую ActiveJob с delayed_job (4.0.6) в фоновом режиме, и я хочу найти запланированное задание для его удаления.Как получить доступ к экземпляру Delayed Job внутри Active Job - Rails 4.2

Например, если у меня есть

class MyClass 

    def my_method 
    perform_stuff 
    MyJob.set(wait: 1.month.from_now).perform_later(current_user) 
    end 
end 

Тогда, если я редактировать MyCLASS экземпляр и вызвать my_method снова, я хочу, чтобы отменить эту работу и планировать новую.

Как было предложено в этой должности http://www.sitepoint.com/delayed-jobs-best-practices, я добавил две колонки к отложенным таблице работы:

table.integer :delayed_reference_id 
table.string :delayed_reference_type 

add_index :delayed_jobs, [:delayed_reference_id], :name => 'delayed_jobs_delayed_reference_id' 
add_index :delayed_jobs, [:delayed_reference_type], :name => 'delayed_jobs_delayed_reference_type' 

Так этот путь я могу найти замедленную работу и уничтожить его. Но я хотел сделать это внутри класса ActiveJob, чтобы сохранить шаблон работы в моем проекте.

Я хотел сделать что-то вроде:

class MyJob < ActiveJob::Base 

    after_enqueue do |job| 
    user = self.arguments.first 
    job.delayed_reference_id = user.id, 
    job.delayed_reference_type = "User" 
    end 

    def perform(user) 
    delete_previous_job_if_exists(user_id) 
    end 

    def delete_previous_job_if_exists(user_id) 
    Delayed::Job.find_by(delayed_reference_id: 1, delayed_reference_type: 'User').delete 
    end 
end 

Но это не работает.

У кого-нибудь был такой вопрос?

+0

Вы смогли найти решение? Выполнение этой же проблемы – pthamm

ответ

1

два изменения: 1. обновил after_enqueue обратного вызова, так что вы можете обновить таблицу delayed_jobs непосредственно 2. Исправлена ​​опечатка, где delayed_reference_id было трудно закодированный как 1

Это должно работать:

class MyJob < ActiveJob::Base 

    after_enqueue do |job| 
    user = self.arguments.first 
    delayed_job = Delayed::Job.find(job.provider_job_id) 
    delayed_job.update(delayed_reference_id:user.id,delayed_reference_type:'User') 
end 

    def perform(user) 
    delete_previous_job_if_exists(user.id) 
    end 

    def delete_previous_job_if_exists(user_id) 
    Delayed::Job.find_by(delayed_reference_id: user_id, delayed_reference_type: 'User').delete 
    end 
end 
Смежные вопросы