Rails 4:找到所有记录

jem*_*ger 48 activerecord ruby-on-rails-4

现在,在Rails 4中不推荐使用ActiveRecord :: Relation#all,你应该如何迭代所有记录?

过去像:

Foo.all.each do |foo|
  # whatever
end
Run Code Online (Sandbox Code Playgroud)

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

Foo.where(true).each do |foo|
  # whatever
end
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

小智 66

根据Active Record Query Interface上的Rails指南,迭代所有记录的正确方法是使用find_each.

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

从指南:

该find_each方法检索一批记录,然后将每个记录单独作为模型产生到块.在以下示例中,find_each将检索1000条记录(当前默认两者find_each和find_in_batches),然后分别产生每个记录块的一种模式.重复此过程,直到处理完所有记录:

User.find_each do |user|
  NewsLetter.weekly_deliver(user)
end
Run Code Online (Sandbox Code Playgroud)

参考文献:


sev*_*cat 13

是的,Foo.all.

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

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


use*_*885 11

Rails 4的发行说明:

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

所以你的代码看起来像这样:

Foo.all.to_a.each do |foo|
  # whatever
end
Run Code Online (Sandbox Code Playgroud)

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