当我这样做时
users = User.find(:all)
在Rails中,根据我的理解,它从我的数据库中提取所有用户。
如果您拥有数千条用户记录,这似乎很容易就会占用您服务器的内存。这是真的?如果确实如此,是否有办法在不破坏服务器的情况下迭代表中的数据?
答案 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帮助程序。