Rails中的数据迭代器



当我这样做的时候

users = User.find(:all)

在Rails中,根据我的理解,它从我的数据库中拉入所有用户。

如果你有成千上万的用户记录,这似乎很容易吃掉你的服务器内存。这是真的吗?如果这是真的,有没有一种方法可以在不杀死服务器的情况下遍历表中的数据?

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

User.find_each { |user| user.some_method }

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

Find in batches与此类似,但它提供的是数组而不是单个对象:

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

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

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

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

我认为Rails 2看起来像

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

也许不是你想要的,但这已经解决了我的一些瓶颈。

确实,你的方法很容易消耗大量的服务器资源。

作为批量查找对象的另一种选择,您可以使用will_paginate helper。

最新更新