我一直试图让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的用户可能很难,考虑到密码字段的处理方式),但这不起作用。
长话短说:
答案 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类。