Rails中的数据迭代器?

时间:2011-04-05 19:23:49

标签: ruby-on-rails iterator

当我这样做时

users = User.find(:all)
在Rails中,根据我的理解,它从我的数据库中提取所有用户。

如果您拥有数千条用户记录,这似乎很容易就会占用您服务器的内存。这是真的?如果确实如此,是否有办法在不破坏服务器的情况下迭代表中的数据?

3 个答案:

答案 0 :(得分:5)

从rails 2.3开始,你可以使用find_each和find_in_batches:

User.find_each { |user| user.some_method }

将加载默认的1000个用户。您还可以使用:batch_size选项更改默认大小。

批量查找是类似的,但它为块而不是单个对象提供数组:

 User.find_in_batches do |users|
  users.each { |user| user.some_method }
end

答案 1 :(得分:2)

是的,这绝对是真的。可能有一些“对象分页”插件用于此目的,但我从未研究过它。

我知道的一件事是默认情况下像ActiveRecord这样的ORM往往非常浪费。假设您只需要用户的ID和用户名,但users表中实际上有12列。默认情况下,ActiveRecord会抓取所有12列,从而对数据库和服务器的内存造成不必要的负载。消除Rails 3中的浪费:

users = User.select('id, username').all

我认为Rails 2看起来像

users = User.find(:all, :select => 'id, username')

也许不完全是你想要的东西,但这已经减少了我的一些瓶颈。

答案 2 :(得分:1)

实际上,您的方法很容易消耗大量服务器资源。

作为批量查找对象的替代方法,您可以使用will_paginate帮助程序。