【问题标题】:Rails 4: find all recordsRails 4:查找所有记录
【发布时间】:2013-08-11 04:12:57
【问题描述】:

现在 ActiveRecord::Relation#all 在 Rails 4 中已被弃用,您应该如何迭代所有记录?

以前是这样的:

Foo.all.each do |foo|
  # whatever
end

我现在可以这样近似,但感觉很脏:

Foo.where(true).each do |foo|
  # whatever
end

有没有更好的办法?

【问题讨论】:

    标签: activerecord ruby-on-rails-4


    【解决方案1】:

    根据Rails Guide on Active Record Query Interface,遍历所有记录的正确方法是使用find_each

    使用Foo.all.each会将整个表加载到内存中,实例化所有行;然后遍历实例。 find_each 分批执行此操作,在内存使用方面效率更高。

    来自指南:

    find_each 方法检索一批记录,然后将 每个 记录作为模型单独生成到块中。在以下示例中,find_each 将检索 1000 条记录(find_eachfind_in_batches 的当前默认值),然后将每条记录作为模型单独生成给模块。重复此过程,直到处理完所有记录:

    User.find_each do |user|
      NewsLetter.weekly_deliver(user)
    end
    

    参考资料:

    【讨论】:

    • 可能不会,但是使用find_each 会减少查询次数吗?
    【解决方案2】:

    是的,Foo.all

    all 在 ActiveRecord::Relation(例如Foo.where(true))上被弃用,而不是在 ActiveRecord::Base 上。

    http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-all

    【讨论】:

    • 啊哈,我猜弃用警告是错误的。无论我在哪里使用 Foo.all,都会收到警告
    • 您可能需要详细说明您正在使用的代码以及您收到的警告。
    • 似乎“他们”设置了 where(true) 所以它现在在更高版本的 Rails4.x 中崩溃。错误:“RuntimeError:不支持:TrueClass”。如果某件事会惹恼你的感情,为什么还要让它为他人服务呢?只需将它强加到每个人的喉咙里,让他们花费数百个小时来寻找你故意为他们制造的问题。
    【解决方案3】:

    Rails 4 的发行说明:

    Model.all 现在返回一个 ActiveRecord::Relation,而不是一个数组 的记录。如果你真的想要一个数组,请使用 Relation#to_a。

    所以您的代码将如下所示:

    Foo.all.to_a.each do |foo|
      # whatever
    end
    

    http://guides.rubyonrails.org/4_0_release_notes.html#active-record

    【讨论】:

      【解决方案4】:

      这似乎是 Rails 中某处的不正确弃用警告。从 Rails 4.0.2 开始,警告信息仍然存在。尝试运行 Foo.all 时出现以下错误:

      弃用警告:Relation#all 已弃用。如果你想 急切加载关系,您可以调用#load(例如Post.where(published: true).load)。如果要从关系中获取记录数组, 你可以打电话给#to_a(例如Post.where(published: true).to_a)。

      我几乎 100% 确定我在 RailsCasts 中看到 #all 被更改为返回 Rails 4 中的关系(而不是数组) - 没有提到弃用。

      【讨论】:

        猜你喜欢
        • 2014-09-12
        • 2013-09-24
        • 1970-01-01
        • 1970-01-01
        • 2014-12-08
        • 2017-04-01
        • 2016-07-07
        • 2016-04-11
        相关资源
        最近更新 更多