所以我有很多数据库操作,我把它放在我的帮助器中,我想在后台做。例如,我在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
答案 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
创建的内容。