Rails set(wait: 2.minutes) метод для активной работы не работает

Создание фонового задания с помощью гема resque_scheduler на сервере Redis.

 class Estamps::OrderAssignment < ActiveRecord::Base

  after_save :enqueue_check_status

   def enqueue_check_status 
       AutoRejectionJob.set(wait: 2.minutes).perform_later(self.id)
   end
 end

 class AutoRejectionJob < ActiveJob::Base
   queue_as :default

   def perform(*args) 
    order_assignment_id = args[0]
    order_assignment = Estamps::OrderAssignment.find(order_assignment_id)
    if order_assignment.status_id == 1 || order_assignment.status_id == nil
      order_assignment.status_id = 3
      order_assignment.save!
    end
  end
 end         

При создании записи OrderAssignment или при обновлении через 2 минуты следует запустить задание AutoRejection. Здесь, вероятно, не работает установленный параметр (подождите: 2. минуты), т.е.

   AutoRejectionJob.perform_later(self.id)

работает отлично, но

  AutoRejectionJob.set(wait: 2.minutes).perform_later(self.id)

ничего не делает. Не удалось исправить проблему. Новичок в Rails, пожалуйста, помогите.

2 ответа

Я не вижу проблем с вашим кодом. Я проверил: .set(wait: 2.minutes) работает как положено в rails 5.0.2 поверх ruby ​​2.4.0

Как и ваш призыв к работе. На мой взгляд, вы пытаетесь установить статус, используемый в другом месте. Возможно, ошибка связана с OrderAssignment манипулировать в ходе лечения извне (уничтожен?)

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

Есть также несколько отличных инструментов отладки, которые помогут вам найти, что происходит: byebug, better_errors, pry и, конечно же, rails console, Сделайте себе одолжение: попробуйте их.

Когда я не могу найти способ обойти какое-то поведение, которое выходит за рамки моего понимания, я использую некоторые "путы" и некоторые структуры "попытка / отловить ошибки" (начать спасение в рубине)...:

def perform(*args) 
  puts "@@@@@@@ JOB TRIGGERED @@@@@@"
  begin
    order_assignment_id = args[0]
    order_assignment = Estamps::OrderAssignment.find(order_assignment_id)
    puts "#{order_assignment.inspect}"
    if order_assignment.status_id == 1 || order_assignment.status_id == nil
      order_assignment.status_id = 3
      order_assignment.save!
    end
    puts "@@@@@@@ JOB DONE @@@@@@"
  rescue StandardError => e
    # ... display e.message ...
  ensure
    #... 
  end
end
  1. проверьте версию рельсов.
  2. проверьте свои журналы rails (папка журнала, все задания будут записывать сообщение в файлы журнала при выполнении)
Другие вопросы по тегам