开发者

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜