防止Rails中的N + 1个查询

时间:2011-03-27 20:50:10

标签: ruby-on-rails query-optimization entity-relationship select-n-plus-1

我已经看到一些在Rails中调用ActiveRecord的:include方法之一时传递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

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

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

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

User.favorites(:include => :user)

2 个答案:

答案 0 :(得分:6)

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

@user.favorites

查看此截屏直播

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

将是

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

或适用于Rails 3.x

 User.includes(:favorites)

答案 1 :(得分:1)

您可以将:include添加到模型的关联中,以便在加载对象时急切加载二阶关联。

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

相关问题