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