Увеличение с помощью delayed_job - PullRequest
0 голосов
/ 17 августа 2011

Я пытаюсь отложить приращение столбца (yest_shareholder_count) на один день, когда создается investment, чтобы вести учет количества пользователей, у которых было investment в * 1004. * один день назад (поэтому я могу использовать эти данные для составления графиков, отслеживающих количество инвесторов с течением времени).

Я подумал, что самый простой способ сделать это - использовать delayed_job, но это не работает. Задержка_job создается в отдельной таблице и, согласно Браузеру БД SQLite, запускается на один день позже. Но столбец yest_shareholder_count не увеличивается.

Venture Модель:

  def yest_increment
       self.increment!(:yest_shareholder_count)
  end
  handle_asynchronously :yest_increment, :run_at => Proc.new {1.minute.from_now}

Investments Контроллер:

  def create
    @venture = Venture.find(params[:share_id])

    @venture_increment= @venture.increment(:shareholder_count)
    @venture_yest_increment= @venture.yest_increment

    @investment = current_user.invest!(@venture)

    if @venture_increment.save and @venture_yest_increment.save
    respond_to do |format|
        format.html {redirect_to @venture}
            end
    end

  end

Простое приращение происходит так, как должно, но задержанное приращение никогда не происходит.

Это содержимое столбца «обработчик» в таблице delayed_jobs, на всякий случай, если они полезны:

--- !ruby/struct:Delayed::PerformableMethod 
object: !ruby/ActiveRecord:Venture
  attributes: 
    created_at: 2011-06-21 07:00:12.252808
    onemth_shareholder_count: 0
    updated_at: 2011-08-09 16:50:36.864354
    onewk_shareholder_count: 0
    shareholder_count: 4
    id: 49
    user_id: 40
    yest_shareholder_count: 0
method_name: :yest_increment_without_delay
args: []

Я не уверен, откуда исходит "yest_increment_without_delay", или почему "args" пусто ...

Любая помощь высоко ценится.

РЕДАКТИРОВАТЬ: у меня есть "1.minute.from_now" вместо "1.day.from_now" только для проверки кода.

1 Ответ

2 голосов
/ 17 августа 2011

Когда вы определяете метод для асинхронной обработки с использованием отложенного задания, отложенное задание создает цепочку псевдонимов методов (с которой я не очень знаком).Это приводит к вызовам оригинального имени метода, обработанного отложенным заданием, и когда задержанное задание находит его, он вызывает original_method_name_without_delay, который является псевдонимом фактического метода объектов.

Нет аргументов, поскольку вы не передалилюбые аргументы yest_increment.Если вы передадите какие-либо аргументы в yest_increment, они будут сохранены вместе с заданием, которое будет передано фактическому методу, когда отложенное задание вызывает его.

Объект в таблице является сериализованной версией объекта,delayed_job хранит в дБ.Когда необходимо выполнить задание, оно создаст объект путем десериализации этого и вызовет метод с заданными аргументами.Поскольку объект является объектом ActiveRecord, десериализация включает в себя получение идентификатора из сериализованного объекта и поиск объекта из базы данных.

Что касается вашей реальной проблемы, то, что она не работает, не ясно, что не работает.Если отложенное задание не вызывается, или значение не увеличивается, или delayed_job вызывается слишком рано.Если это последний, может помочь изменение кода на следующий:

handle_asynchronously :yest_increment, :run_at => Proc.new {Time.now.beginning_of_day + 1.day}
...