ruby-on-railsquery-optimizationentity-relationshipselect-n-plus-1

Preventing N+1 queries in Rails


I've seen a few examples of passing an :include hash value when calling one of ActiveRecord's find methods in Rails. However, I haven't seen any examples of whether this is possible via relationship methods. For example, let's say I have the following:

def User < ActiveRecord::Base
  has_many :user_favorites
  has_many :favorites, :through => :user_favorites
end

def Favorite < ActiveRecord::Base
  has_many :user_favorites
  has_many :users, :through => :user_favorites
end

def UserFavorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :favorite
end

All the examples I see show code like this:

User.find(:all, :include => :favorite)

But I don't see any examples showing the use of relationships. Would it instead be possible for me to do something like this?

User.favorites(:include => :user)

Solution

  • You can't use relations as Class methods. It is instance methods. You can call

    @user.favorites
    

    Check out this screencast about Eager Loading

    http://railscasts.com/episodes/22-eager-loading

    It will be

     User.find(:all, :include => :favorites)
    

    or for Rails 3.x

     User.includes(:favorites)