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
- проверьте версию рельсов.
- проверьте свои журналы rails (папка журнала, все задания будут записывать сообщение в файлы журнала при выполнении)