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
| 归档时间: |
|
| 查看次数: |
52832 次 |
| 最近记录: |