【发布时间】:2012-03-13 01:38:45
【问题描述】:
因此,我有许多数据库操作放入我的助手中,我想在后台执行这些操作。例如,我在我的用户助手中定义了一个记录活动方法。创建 Post 时,我想记录此活动,即在 Posts 控制器的 create 方法中:
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,而且我有延迟作业版本 2.1.4。
谁能建议如何进行这项工作?
编辑 *
我认为 mu_is_too_short 提供的答案是正确的道路。它创建了一个延迟的作业,只是它没有正确执行 record_activity 方法。当delayed_job worker 启动时,它执行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
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 delayed-job