Rails 4: find all records
Solution 1:
According to the Rails Guide on Active Record Query Interface, the correct way to iterate through all records is by using find_each
.
Using Foo.all.each
will load the entire table into memory, instantiating all the rows; then iterate through the instances. find_each
does this in batches, which is more efficient in terms of memory usage.
From the guide:
The
find_each
method retrieves a batch of records and then yields each record to the block individually as a model. In the following example,find_each
will retrieve 1000 records (the current default for bothfind_each
andfind_in_batches
) and then yield each record individually to the block as a model. This process is repeated until all of the records have been processed:
User.find_each do |user|
NewsLetter.weekly_deliver(user)
end
References:
- Active Record Query Interface
- ActiveRecord::Batches
Solution 2:
yes, Foo.all
.
all
is deprecated on an ActiveRecord::Relation (eg. Foo.where(true)
), not on ActiveRecord::Base.
http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-all
Solution 3:
Release notes for Rails 4:
Model.all now returns an ActiveRecord::Relation, rather than an array of records. Use Relation#to_a if you really want an array.
So your code will look like this:
Foo.all.to_a.each do |foo|
# whatever
end
See http://guides.rubyonrails.org/4_0_release_notes.html#active-record