开发者

Data iterators in Rails?

开发者 https://www.devze.com 2023-02-22 20:12 出处:网络
When I do users = User.find(:all) in Rails, from my understanding, it pulls in all users from my database.

When I do

users = User.find(:all)

in Rails, from my understanding, it pulls in all users from my database.

This seems like it could easily eat your server's memory if you have thousands of user records. Is this true? If it is true, is there a way to iterate over data in a table without killin开发者_开发问答g your server?


Since rails 2.3 you can use find_each and find_in_batches:

User.find_each { |user| user.some_method }

will load a default of 1000 users. You also have the :batch_size option to change the default size.

Find in batches is similar but it provides the array to the block instead of the single object:

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


Yes, it's definitely true. There may be some "object pagination" plugins for that purpose, but I have never looked into it.

One thing I do know is that ORMs like ActiveRecord tend to be very wasteful by default. Let's say you only need your user's ids and usernames, but there are actually 12 columns in the users table. By default ActiveRecord grabs all 12 columns, putting unnecessary load on both your database and your server's memory. To eliminate that waste in Rails 3:

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

I think Rails 2 would look something like

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

Maybe not exactly what you were looking for, but that's cut out quite a few bottlenecks of mine.


Indeed, your method can easily consume a lot of server resources.

As an alternative to finding objects in batches, you can use will_paginate helper.

0

精彩评论

暂无评论...
验证码 换一张
取 消