Итак, у меня есть много операций с базами данных, которые я помещаю в свои помощники, которые хочу выполнять в фоновом режиме.В качестве примера я определяю метод 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