Я использую DelayedJob, и я хочу обновить приложение Rails 4.2 для использования ActiveJob. Проблема заключается в том, что у меня есть куча пользовательских рабочих мест, которые выглядят следующим образом:Как использовать пользовательские задания delayed_job с ActiveJob?
AssetDeleteJob = Struct.new(:user_id, :params) do
def perform
# code
end
# more methods n' stuff
end
Тогда в контроллере где-то задание помещается в очередь с этим синтаксисом:
@asset_delete_job = AssetDeleteJob.new(current_admin_user.id, params)
Delayed::Job.enqueue @asset_delete_job
я хотел бы найти эквивалент для ActiveJob. Вышеуказанное в основном прямо из диджейских документов. Использование его для включения одного вызова так же просто, как вызов метода выполнения задания, как и у DJ. Но мои более сложны и требуют синтаксиса синтаксиса DJ и аргументы, переданные ему.
Вот что я пытался до сих пор:
class AssetDeleteJob < ActiveJob::Base
queue_as :default
def initialize(user_id, params)
@user_id = user_id
@params = params
end
def perform
#code
end
# more methods n' stuff
end
job = AssetDeleteJob.new(1, {ids: [1,2,3]})
К сожалению, созданный объект не имеет метод #perform_later, как я бы ожидать. У него есть #enqueue, но я получаю странное сообщение об ошибке:
Could not log "enqueue.active_job" event. NoMethodError: undefined method `any?' for nil:NilClass
... а затем трассировки стека в массиве, заканчивающийся в
NoMethodError: undefined method `map' for nil:NilClass
нечетного пару ошибок, но я мог бы не должно быть доступ к #enqueue напрямую. Вышеприведенное выглядит так, как будто на носу довольно хорошо, что и ищет ActiveJob. Что мне не хватает?