Delayed_job不会运行用户定义的方法

时间:2012-03-14 03:20:32

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

我一直试图让DelayedJob在后台运行一些用户定义的方法。对于此测试用例,我在帮助程序中定义了以下方法:

 def test_case
    u = User.new
     u.first_name = "JimBob"
     u.last_name = "joe"
     u.email = "itworked@eureka.com"
     u.password = "sailsJ123"
     u.password_confirmation = "sailsJ123"
     u.save
  end

然后,在控制器动作中,我定义:

  def action_name
     #whatever it does outside of this
     test_case

  end

这会导致test_case在运行此处的操作时创建新用户。如果我试图延迟工作,我将其改为:

  def action_name
     #whatever it does outside of this
     self.delay.test_case
  end

这会导致创建delayed_job,但是有一些迹象表明我做错了:具体来说,delayed_job表中的处理程序包含在action_name中其他地方加载的所有信息(在这种情况下是一个大约50000的非常大的文件)字符),而不仅仅是指定运行test_case或其他东西的简单处理程序。

如果我改变这个以继续测试,我试图这样做:

 def action_name
     #whatever it does outside of this
     u = User.new
     u.first_name = "JimBob"
     u.last_name = "joe"
     u.email = "itworked@eureka.com"
     u.password = "sailsJ123"
     u.password_confirmation = "sailsJ123"
     u.delay.save
  end

这会成功创建一个DJ,并且正如预期的那样,它会加载一个指定细节的处理程序(例如,u.name =>“JimBob”......)。但是当作业运行时,不会创建新用户。我甚至试图切换它只是为了摧毁一个用户(我可能会创建一个带有DJ的用户可能很难,考虑到密码字段的处理方式),但这不起作用。

长话短说:

  1. 如何让DJ正确运行背景方法?
  2. 如果创建的延迟作业看起来很简单,那么对数据库没有任何更改是怎么回事?

2 个答案:

答案 0 :(得分:0)

这并不表示出现了问题:

  

delayed_job表包含在action_name

中其他地方加载的所有信息

在这种情况下会出现这种情况,因为你这样说:

self.delay.test_case

self是恰好有params的控制器和你可能不关心的各种其他东西; DJ必须序列化self才能为test_case提供适当的上下文。也许你在某个地方碰到了一个大小限制,那个大文件卡在self

我认为你的第二个“呼吁delay关于其他事情”的方法正朝着正确的方向发展。

你可以尝试查询一个工作班:

class ItsAJob
    def perform
        u = User.new
        u.first_name = "JimBob"
        u.last_name = "joe"
        u.email = "itworked@eureka.com"
        u.password = "sailsJ123"
        u.password_confirmation = "sailsJ123"
        u.save
    end
end

# and elsewhere...
Delayed::Job.enqueue(ItsAJob.new)

或者尝试将您的方法设为类方法,以便在类上.delay

class YourController
    def action_name
        self.class.delay.test_case
    end

    def self.test_case
        u = User.new
        u.first_name = "JimBob"
        u.last_name = "joe"
        u.email = "itworked@eureka.com"
        u.password = "sailsJ123"
        u.password_confirmation = "sailsJ123"
        u.save
    end

答案 1 :(得分:0)

您不能在ActiveRecord模型上延迟#save,因为DJ会在执行您的操作之前尝试从数据库重新加载模型。所有数据都将丢失。而是使用创建User的#perform方法创建Job类。