Rails 4:find所有logging
既然ActiveRecord :: Relation#all在Rails 4中已经被弃用,那么你应该如何迭代所有的logging呢?
曾经像:
Foo.all.each do |foo| # whatever end 我现在可以像这样估计它,但感觉很脏:
 Foo.where(true).each do |foo| # whatever end 
有没有更好的办法?
 根据活动logging查询接口上的Rails指南 ,迭代所有logging的正确方法是使用find_each 。 
 使用Foo.all.each将把整个表加载到内存中,实例化所有的行; 然后遍历实例。  find_each可以批量执行此操作,在内存使用方面效率更高。 
从指南:
find_each方法检索一批logging,然后将每个logging单独作为模型生成。 在以下示例中,find_each将检索1000条logging(find_each和find_in_batches的当前缺省值),然后将每条logging单独作为模型输出到该块。 重复这个过程,直到所有的logging都被处理完毕:
 User.find_each do |user| NewsLetter.weekly_deliver(user) end 
参考文献:
- 活动logging查询接口
- 的ActiveRecord ::批
 是的, Foo.all 。 
  all在ActiveRecord :: Relation(例如Foo.where(true) )上被弃用,而不是在ActiveRecord :: Base上。 
http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-all
Rails 4的发行说明:
Model.all现在返回一个ActiveRecord :: Relation,而不是一个logging数组。 如果你确实需要一个数组,可以使用Relation#to_a。
所以你的代码如下所示:
 Foo.all.to_a.each do |foo| # whatever end 
请参阅http://guides.rubyonrails.org/4_0_release_notes.html#active-record
这在Rails的某个地方似乎是不正确的弃用警告。 从Rails 4.0.2开始,警告信息依然存在。 当我尝试运行Foo.all时出现以下错误:
退步警告:关系#全部已被弃用。 如果你想加载一个关系,你可以调用#load(例如
Post.where(published: true).load)。 如果你想从一个关系中得到一组logging,你可以调用#to_a(例如Post.where(published: true).to_a)。
我几乎100%肯定我在RailsCasts中看到#all被更改为返回Rails 4中的关系(而不是数组) – 没有提及弃用。