Beware of calling #count on Active Record relations!
Given code like this:
records = Record.includes(:related).all # Eager-loads to prevent N+1 queries...
records.each do |record|
puts record.related.count # => ... but this produces N+1 queries anyway!
end
If you run this, you'll notice you get an N+1 queries
problem, even though we're using #includes
. This happens because of record.related.count
. Remember, records.related
here is not an Array
but an instance of CollectionProxy
and its #count
method always reaches out to the database. Use #length
or #size
instead to solve this issue.
records = Record.includes(:related).all
records.each do |record|
puts record.related.length # Problem solved!
end