我安装了delayed_job 3.0.2,它适用于对象的方法调用。但是,如果我在类上调用范围,例如,
Listing.delay.all
然后我收到错误stack level too deep
。如果我在任何课程上调用任何范围,就会发生这种情况。
这是设计错误吗?我在这里得到stack level too deep
错误的原因是什么?
谢谢。
答案 0 :(得分:3)
要间接回答您的问题,看起来您没有正确使用delayed_job。我会解释你的代码做了什么,并建议你可能要做的事情。
Listing.delay.all
delay
之后的方法(在这种情况下,all
)将在后台执行。它将返回一个Delayed :: Backend :: ActiveRecord :: Job对象,而不是返回一个列表数组。这不是你的情况,但我会达到目的。
您的后台任何作业都应该有side effect,因为未存储延迟作业的返回值。通常,副作用是将某些内容存储在数据库中,创建文件或其他可以在以后检测和使用的内容。通过查看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"]
尽管如此,Listing.all
和所有其他范围方法都没有任何副作用;他们只查找范围的列表并返回它们。使用delayed_job时,请务必仅在具有副作用的方法上使用它,例如更新数据库等。
不幸的是,如果不知道你想要完成什么,就很难就如何在你的场景中使用delayed_job提出建议,或者即使它是适合这项工作的工具。
首先,我会说在Listing.delay.all
上获得堆栈级别太深的错误是不正常的。我能够在我的Rails 3应用程序中使用delayed_job 3.0.2在ActiveRecord模型User
上使用它,并且它运行正常。 (它没有做任何有价值的事情,但它返回了一个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是否真的是你正在做的事情的正确工具(如果你用它来将数据传递到一个视图就不是这样),正确使用它,然后看看你是否还在有问题。
答案 1 :(得分:1)
您应该创建一个自定义作业,然后将其排队。
class UserJob < Struct.new
def perform
User.all
end
end
Delayed::Job.enqueue UserJob.new()