Iterating over a collection of ActiveRecord models can incur a performance hit to your application, especially when the result set is large.
A basic query like
where could return tens of thousand of records. When that query returns, it will instantiate your records all at once, loading them into memory, and potentially leading to instability. Luckily if we need to operate on a large result set, we can use the
find_each method to work in batches on our query.
find_each works by using the
find_in_batches method under the hood, with a default batch size of
# This is bad ❌ Customer.where(active: true).each do |customer| # .... end # This is good ☑️ Customer.where(active: true).find_each do |customer| # .... end
If you need to, you can also adjust the batch size by passing the
batch_size kwarg to
Customer.where(active: true).find_each(batch_size: 2000) do |customer| # ... end