【问题标题】:Delay a user defined helper method with delayed_job使用 delay_job 延迟用户定义的辅助方法
【发布时间】: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


    【解决方案1】:

    我认为控制台中的record_activity.delay 的工作方式与您想象的不同。这将执行record_activity 之前 delay 有机会做任何事情。

    必须先调用delay,然后根据delay 返回的内容调用延迟方法:

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

    delay 调用将返回一个对象,该对象拦截所有方法调用(可能通过method_missing),对它们进行 YAML 化,并将 YAML 添加到其在数据库中的延迟作业队列表中。所以,只是说 record_activity.delay 并没有做任何有用的事情,它只是执行 record_activity,创建延迟作业拦截器对象,并丢弃 delay 创建的内容。

    【讨论】:

    • 嗯,这看起来不错,但会造成工作延迟。然而,当它执行时,它并没有正确完成record_activity(即没有创建活动记录)——但也没有产生任何错误,因此该作业从delayed_jobs 表中消失了。延迟工作的限制是什么?这里有什么建议吗?问题是这里的延迟调用吗?
    • @jay:你有没有重新启动你的延迟工作的工人?他们不会自动重新加载任何东西。 record_activity 是什么样的?如果没有delay 调用,它是否可以正常工作?
    • 已重新启动测试。将 record_activity 添加到问题中(以及我测试过的变体)。
    • 哦,是的,它运行良好,没有延迟呼叫。对我的问题的编辑有更多关于方法的信息。
    • @jay:嗯。您的延迟工作的工作人员是否连接到正确的数据库?也许添加一些Rails.logger 调用来观察正在发生的事情并看看activity.save 做了什么,切换到activity.save! 也可能有用。
    猜你喜欢
    • 2011-11-19
    • 2017-05-25
    • 2012-11-04
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    相关资源
    最近更新 更多