正确使用delayed_job
要间接回答您的问题,您似乎没有正确使用 delay_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 应用程序中的 ActiveRecord 模型 User 上使用它,并使用延迟_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 是否真的是您正在做的事情的正确工具(如果您使用它来获取数据以传递给视图,则不是),正确使用它,然后看看您是否还在有问题。