Я использую плагин Delayed Jobs для Rails 2, и каждый раз, когда я пытаюсь изменить модель и сохранить ее в методе «execute», требуемом для Delayed Jobs, он выходит из строя (никаких сообщений об ошибках или чего-то еще, это просто указан как сбой в базе данных).
У меня есть метод "execute" в одном из моих файлов моделей рельсов (Видео), и я передаю экземпляр этой модели (скажем, @video) в Delayed :: Job.enqueue
Это известная проблема, что вы не можете вносить изменения в базу данных, находясь в очереди? Я делаю что-то не так (происходит сбой только при попытке сохранить, а не когда я на самом деле изменяю атрибуты, и это звучит как проблема модификации базы данных).
Если это ожидается: как я могу это исправить? Я пытаюсь сохранить атрибут "done" в true, поэтому я знаю, когда модель готова перейти к следующему шагу. Есть ли какой-нибудь стандартный способ выяснить, когда выполняется отложенная работа?
РЕДАКТИРОВАТЬ: я подтвердил, что вызов выполнить автономно (без отложенного задания) не имеет проблем с сохранением (без ошибок или предупреждений, или что-нибудь). Когда я вызываю его через DelayedJobs, он выходит НЕМЕДЛЕННО (без тайм-аута), как только он попадает в строку сохранения.
РЕДАКТИРОВАТЬ: Подожди, я думаю, что я вижу, что происходит: мое "перформанс" является частью обратного вызова "after_create" ... Что все хорошо, пока я не попытаюсь СОХРАНИТЬ. Похоже, что когда я сохраняю, он вызывает «ВНОВЬ» (пока он уже в работе), и это не работает с отложенными заданиями (и не должно). По какой-то причине я думал, что after_create будет вызываться только один раз (не после каждого сохранения). Подождите, простой тест только что показал, что это так. Хм ... Так почему перфоманс выполняется дважды, когда я сохраняю, и один раз, когда нет, на отложенных заданиях?
Мой код:
after_create :start_transcodes
def start_transcodes
Delayed::Job.enqueue self
end
def perform
puts "performing"
self.flash_status = 100
self.save!
puts "done"
end
Что я вижу:
performing
performing
2 jobs processed at 3.3406 j/s, 2 failed ...
Я не вижу, чтобы это говорило "сделано" никогда.
В журнале рельсов я вижу:
"* [JOB] Video failed with NameError: undefined local variable or method `flush_deletes' for #<Paperclip::Attachment:0xb6e51da0> - 2 failed attempts
undefined local variable or method `flush_deletes' for #<Paperclip::Attachment:0xb6e51da0>"
Я использую плагин paperclip для этого класса, и я могу вызвать save весь день (даже в этом методе execute) и не получить никаких проблем. Я ТАКЖЕ могу вызывать save (опять же, даже во время выполнения) весь день и не видеть, как мой метод after_create вызывается более одного раза - ЕСЛИ Я не использую отложенное задание (может быть, выполняется какая-то автоматическая повторная попытка?)
Я собираюсь осмотреть мой плагин для скрепок, посмотреть, что происходит ...