Задержка пользовательского вспомогательного метода с delayed_job - PullRequest
1 голос
/ 22 февраля 2012

Итак, у меня есть много операций с базами данных, которые я помещаю в свои помощники, которые хочу выполнять в фоновом режиме.В качестве примера я определяю метод record_activity в моем помощнике Users.Когда создается сообщение, я хочу записать это действие, т. Е. В методе создания в контроллере сообщений:

 def create
     #operations to save the post
     record_activity(user, post)
 end

По соображениям производительности я хочу отложить эту запись и другие действия и запустить их с работниками нафоны.Я использую delayed_job для задержки почтовых программ, и это отлично работает.В консоли rails method.delay работает отлично, то есть я мог бы в консоли rails сделать:

 record_activity.delay

Однако та же задержка не работает, когда записывается в контроллере, т. Е. Следующее все еще работает в реальном времени, без задержки:

 def create
     #operations to save the post
     record_activity(user, post).delay
 end

Почему это?Я использую Rails 3.0.9 в одном приложении и Rails 3.1.3 в другом, плюс у меня есть delayed_job версии 2.1.4.

Кто-нибудь может подсказать, как заставить это работать?

РЕДАКТИРОВАТЬ*

Я думаю, что ответ, предоставленный mu_is_too_short, является правильным путем.Он создает отложенное задание, только он не выполняет метод record_activity правильно.Когда запускается работник delayed_job, он выполняет delayed_job и не имеет ошибок, а также удаляет запись, как если бы она работала.Но никакая деятельность не регистрируется.Чтобы дать некоторый контекст, вот вызов и метод, который я сейчас устраняю:

self.delay.record_activity(user, @comment)

И метод:

def record_activity(current_user, act)
   activity = Activity.new
   activity.user_id = current_user.id
   activity.act_id = act.id
   activity.act_type = act.class.name
   activity.created_at = act.created_at
   activity.save
end 

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

    self.delay.record_activity(user.id, @comment.id, @comment.class.name, @comment.created_at)

И измененный метод:

   def record_activity(current_user_id, act_id, act_type, act_created_at)
     activity = Activity.new
     activity.user_id = current_user_id
     activity.act_id = act_id
     activity.act_type = act_type
     activity.created_at = act_created_at
     activity.save
   end

1 Ответ

2 голосов
/ 22 февраля 2012

Я не думаю, что record_activity.delay в консоли работает так, как вы думаете.Это будет выполнено record_activity до того, как delay сможет что-либо сделать.

Сначала должен выполняться вызов delay, затем вы вызываете свой отложенный метод для того, что delayвозвращает:

def create
    self.delay.record_activity(user, post)
end

Вызов delay вернет объект, который перехватывает все вызовы методов (возможно, через method_missing), YAMLize их и добавляет YAML в свою таблицу отложенных заданий в базе данных.Таким образом, просто сказать, что record_activity.delay не делает ничего полезного, он просто выполняет record_activity, создает объект-перехватчик с отложенным заданием и выбрасывает то, что delay создало.

...