使用delayed_job延迟用户定义的辅助方法

时间:2012-02-22 17:15:37

标签: ruby-on-rails ruby-on-rails-3 delayed-job

所以我有很多数据库操作,我把它放在我的帮助器中,我想在后台做。例如,我在Users帮助器中定义了record_activity方法。创建帖子后,我想记录此活动,即在帖子控制器的创建方法中:

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

出于性能原因,我想延迟此record_activity和其他人,并在后端与工作人员一起运行它们。我使用delayed_job来延迟邮件程序,它运行良好。在rails控制台中,method.delay工作得很好,即我可以在rails控制台中执行:

 record_activity.delay

但是,在控制器中写入时,相同的.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 个答案:

答案 0 :(得分:2)

我不认为控制台中的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创建的内容。