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_eachfind_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中的关系(而不是数组) – 没有提及弃用。