Preventing N+1 queries in Rails
I've seen a few examples of passing an :include
hash value when calling one of ActiveRec开发者_开发技巧ord'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)
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)
You can add :include
to your model's associations to eager load the second-order associations when the object is loaded.
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many
精彩评论