【问题标题】:delayed_job doesn't work with Rails ActiveRecord scopedelay_job 不适用于 Rails ActiveRecord 范围
【发布时间】:2012-04-23 02:35:34
【问题描述】:

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

Listing.delay.all

然后我得到错误stack level too deep。如果我在我拥有的任何类上调用任何范围,就会发生这种情况。

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

谢谢。

【问题讨论】:

  • 您使用的是什么版本的延迟作业? 3.0.0 中存在延迟调用类方法的错误
  • 嗨,我正在使用delayed_job 3.0.2
  • 为什么要在delayed 模式下执行批量读取操作?
  • 因为它是一个非常长且复杂的查询(可能需要一分钟或更长时间),我不希望用户等待那么长时间来加载页面
  • 嗨 KandadaBoggu,我想我误解了你。您能否在答案中解释您的建议?我想这可能就是我想要的。

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


【解决方案1】:

正确使用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 是否真的是您正在做的事情的正确工具(如果您使用它来获取数据以传递给视图,则不是),正确使用它,然后看看您是否还在有问题。

【讨论】:

  • 感谢您的精彩回答!我得到了副作用的故事。堆栈级别太深,我还不能绕圈子。我在控制台上测试了User.delay.all 并收到以下错误:1.9.2-p290 :001 &gt; User.delay.all SystemStackError: stack level too deep from /Users/myname/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb/workspace.rb:80 Maybe IRB bug!! 1.9.2-p290 :002 &gt;
  • 不太可能是 irb 问题。更有可能与您正在使用的宝石进行一些交互。不过,如果使用延迟并没有做任何有用的事情,那真的不值得深入研究。
  • @AdamNYC 你找到错误的原因了吗?我对 workspace.rb:80 也有同样的问题
【解决方案2】:

您应该创建一个自定义作业,然后将其加入队列。

class UserJob < Struct.new
  def perform
    User.all
  end
end

Delayed::Job.enqueue UserJob.new()

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 2015-03-10
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多