我安装了delayed_job 3.0.2,它适用于对象的方法调用。但是,如果我在一个类上调用一个范围,例如,
Listing.delay.all
然后我得到错误stack level too deep
。如果我在我拥有的任何类上调用任何范围,就会发生这种情况。
这是设计错误吗?我stack level too deep
在这里出错的原因是什么?
谢谢你。
我安装了delayed_job 3.0.2,它适用于对象的方法调用。但是,如果我在一个类上调用一个范围,例如,
Listing.delay.all
然后我得到错误stack level too deep
。如果我在我拥有的任何类上调用任何范围,就会发生这种情况。
这是设计错误吗?我stack level too deep
在这里出错的原因是什么?
谢谢你。
要间接回答您的问题,您似乎没有正确使用delayed_job。我将解释你的代码做了什么,并建议你可能正在尝试做什么。
Listing.delay.all
下面的方法delay
(在本例中为all
)将在后台执行。它不会返回列表数组,而是返回一个 Delayed::Backend::ActiveRecord::Job 对象。这不是你的情况发生的事情,但我会谈到这一点。
您背景的任何作业都应该有副作用,因为延迟作业的返回值不会被存储。通常,副作用是将某些内容存储在数据库中、创建文件或其他可以在以后检测和使用的内容。通过查看delayed_job 作业表,可以看到没有存储返回值。
> Delayed::Backend::ActiveRecord::Job.column_names
=> ["id", "priority", "attempts", "handler", "last_error", "run_at", "locked_at", "failed_at", "locked_by", "queue", "created_at", "updated_at"]
也就是说, theListing.all
和所有其他范围方法没有任何副作用;他们只查找范围内的列表并返回它们。使用delayed_job时,一定要只在有副作用的方法上使用,比如更新数据库等。
不幸的是,在不知道您要完成什么的情况下,很难就如何在您的场景中使用delayed_job 给出建议,或者即使它是适合该工作的工具。
首先,我会说出现堆栈级别太深的错误Listing.delay.all
是不正常的。我能够User
在我的 Rails 3 应用程序中的 ActiveRecord 模型上使用 delay_job 3.0.2,并且效果很好。(它没有做任何有价值的事情,但它返回了一个 Job 而不是抛出你得到的错误。)
> User.delay.all
=> #<Delayed::Backend::ActiveRecord::Job id: 1, priority: 0, attempts: 0, handler: "--- !ruby/object:Delayed::PerformableMethod\nobject:...", last_error: nil, run_at: "2012-05-02 02:10:39", locked_at: nil, failed_at: nil, locked_by: nil, queue: nil, created_at: "2012-05-02 02:10:39", updated_at: "2012-05-02 02:10:39">
同样,没有更多信息,任何人都无法帮助您找出错误。我建议首先弄清楚delayed_job 是否真的是您正在做的事情的正确工具(如果您使用它来获取数据以传递给视图,则不是),正确使用它,然后看看您是否还在有问题。
您应该创建一个自定义作业,然后将其排入队列。
class UserJob < Struct.new
def perform
User.all
end
end
Delayed::Job.enqueue UserJob.new()