delayed_job不适用于Rails ActiveRecord范围

时间:2012-04-23 02:35:35

标签: ruby-on-rails activerecord delayed-job named-scope

我安装了delayed_job 3.0.2,它适用于对象的方法调用。但是,如果我在类上调用范围,例如,

Listing.delay.all

然后我收到错误stack level too deep。如果我在任何课程上调用任何范围,就会发生这种情况。

这是设计错误吗?我在这里得到stack level too deep错误的原因是什么?

谢谢。

2 个答案:

答案 0 :(得分:3)

正确使用delayed_job

要间接回答您的问题,看起来您没有正确使用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()