防止Rails中的N + 1个查询

Mat*_*ins 3 entity-relationship ruby-on-rails query-optimization select-n-plus-1

我已经看到了一些在Rails中:include调用ActiveRecord find方法之一时传递哈希值的例子.但是,我还没有看到任何关于这是否可以通过关系方法的例子.例如,假设我有以下内容:

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
Run Code Online (Sandbox Code Playgroud)

我看到的所有示例都显示如下代码:

User.find(:all, :include => :favorite)
Run Code Online (Sandbox Code Playgroud)

但我没有看到任何关于使用关系的例子.相反,我可以做这样的事情吗?

User.favorites(:include => :user)
Run Code Online (Sandbox Code Playgroud)

fl0*_*00r 6

您不能将关系用作Class方法.它是实例方法.你可以打电话

@user.favorites
Run Code Online (Sandbox Code Playgroud)

看看这个关于Eager Loading的截屏视频

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

这将是

 User.find(:all, :include => :favorites)
Run Code Online (Sandbox Code Playgroud)

或者对于Rails 3.x.

 User.includes(:favorites)
Run Code Online (Sandbox Code Playgroud)

  • 不,我说`instance.relationship(:include => ...)`应该和`Class.find(:all,:include => ...)`一样,除了它应该是作用域的到实例.现在的方式是,如果我还想使用`:include`选项,我必须在调用`Class.find`时手动调整查询范围. (2认同)