Preventing N+1 queries in Rails

蹲街弑〆低调 提交于 2019-11-27 07:12:50

问题


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)

回答1:


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)



回答2:


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



来源:https://stackoverflow.com/questions/5452340/preventing-n1-queries-in-rails

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!