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_eachmethod retrieves a batch of records and then yields each record to the block individually as a model. In the following example,find_eachwill retrieve 1000 records (the current default for bothfind_eachandfind_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