Forum: Ruby on Rails find :include causing n+1 queires

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Tim H. (Guest)
on 2009-05-26 09:33
(Received via mailing list)
Hey guys,

I just noticed one of my find calls is creating n+1 queries to be
run.  The find looks like this:

     Class.find(:all,
        :include => [:user, :users],
        :conditions =>  {:id=> ids},
        :order => order )

This is on Rails 2.3.2.

First the class is queried, then the join table between class and
users, and then each user in the users collection is queried
individually. If I remove the :users from the include, then the users
aren't loaded (until I hit them in the view).

I thought the whole point of :include is to avoid the n + 1 scenario?

Cheers,

Tim.
Frederick C. (Guest)
on 2009-05-26 11:36
(Received via mailing list)
On May 26, 6:32 am, Tim H. <removed_email_address@domain.invalid> wrote:
> This is on Rails 2.3.2.
>
> First the class is queried, then the join table between class and
> users, and then each user in the users collection is queried
> individually. If I remove the :users from the include, then the users
> aren't loaded (until I hit them in the view).
>
> I thought the whole point of :include is to avoid the n + 1 scenario?
>
You should get one query per association loaded. If you are getting
more than that then you are probably accidentally loading an
association again. (for example be aware that the :include doesn't
affect the association in the other direction). (I assume that in your
actual app Class is called something else - you may run into strange
problems if you try and override the core class Class with your own)

Fred
This topic is locked and can not be replied to.