Переменные экземпляра ActiveJob не хранятся в DelayedJob - PullRequest
0 голосов
/ 23 октября 2018

Мой вопрос довольно прост.

Используя пользовательский класс, я могу сделать это:

class Job
  def message=(message)
    @message = message
  end

  def perform
    puts @message
  end
end

job = Job.new
job.message = 'hello'
Delayed::Job.enqueue job
Delayed::Job.last.invoke_job
# hello
# => nil

При использовании класса ActiveJob::Base я не могу:

job = MyJob.new

class MyJob < ApplicationJob
  def message= (message)
    @message = message
  end

  def perform(*args)
    puts @message
  end
end

job = MyJob.new
job.message = 'hello'
job.enqueue
Delayed::Job.last.invoke_job

# Performed MyJob (Job ID: a8cadf34-f7f7-406d-abcf-cd96589acdf2) from DelayedJob(default) in 3.58ms
# => nil 

И причина в том, что JobWrapper, который не содержит пользовательских атрибутов, вставляется в таблицу вместо самого экземпляра задания:

Delayed::Backend::ActiveRecord::Job Create (0.5ms)  INSERT INTO "delayed_jobs" ("handler", "run_at", "queue", "created_at", "updated_at") VALUES ('--- !ruby/object:ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper
job_data:
  job_class: MyJob
  job_id: a8cadf34-f7f7-406d-abcf-cd96589acdf2
  provider_job_id: 
  queue_name: default
  priority: 
  arguments: []
  executions: 0
  locale: en
', '2018-10-23 16:34:58.363428', 'default', '2018-10-23 16:34:58.363570', '2018-10-23 16:34:58.363570') RETURNING "id"

Мне известен синтаксис perform_laterи другие относительные детали, пожалуйста, не говорите мне «Вы просто используете это неправильно» .

Это намеченное поведение или это запрещено?Если нет, есть ли обходной путь?

...