Хранение данных в задании для использования при его выполнении

Мне нужно сохранить информацию в то время, когда активное задание запланировано для использования, когда оно будет выполнено позже. Я хотел бы сохранить эту информацию в самом активном задании, но не уверен, что это возможно.

Вот упрощенная версия того, что я пытаюсь сделать, которая воспроизводит ошибку, которую я вижу:

class TestJob < ActiveJob::Base
  queue_as :default

  attr_reader :save_for_later

  def initialize(info)
    @save_for_later = info
  end


  def perform()
    logger.info(@save_for_later)
  end
end

class CollectionsController < ApplicationController
  def schedule_test_job
    TestJob.perform_later(Date.new)
  end
end

Когда я вызываю schedule_test_job в контроллере коллекций, я получаю сообщение об ошибке: неопределенный метод «карта» для nil: NilClass, и действие выполнения не вызывается.

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


person Will    schedule 08.02.2015    source источник
comment
Где вы берете эту ошибку? Вероятно, это потому, что вы не должны переопределять инициализацию, поскольку она также делает некоторые другие вещи. Вы можете передать дату в качестве аргумента задания, поскольку она будет сохранена, но передать ее как числовое, поскольку ActiveJob принимает только базовый тип (который можно легко сериализовать/десериализовать). Вы можете использовать i=Time.current.to_i и Time.at(i)   -  person Cristian Bica    schedule 09.02.2015
comment
@bcd Ошибка возникает при вызове функции schedule_test_job в контроллере. К вашему сведению о том, что для инициализации необходимо делать другие вещи, эта ошибка исчезнет, ​​если я добавлю вызов super() в конце блока инициализации.   -  person Will    schedule 09.02.2015


Ответы (1)


На самом деле все параметры задания передаются perform, поэтому вам нужно написать:

class TestJob < ActiveJob::Base
  def perform(date)
    logger.info(date)
  end
end

TestJob.perform_later(Date.new)

Вторая проблема заключается в том, что Date AFAIK не сериализуется ActiveJob. Но вы можете легко передать строку, а затем проанализировать дату;)

person Geoffroy    schedule 19.04.2015