N + 1查询,即使在Rails 3.2中加载Eager也是如此

时间:2014-09-18 00:33:12

标签: ruby-on-rails-3 activerecord

我有一个has_many通过,需要急切加载的关系。这在Rails 3.2中是否可行?我已经尝试了几种方法来包含关联,但是在facebook_user对象上调用类别总是会对Category进行另一个查询。这是我的activerecord协会的简化版本。

class FacebookUser < ActiveRecord::Base
  belongs_to :user, touch: true
  has_many   :user_categories, through: :user
  has_many   :categories, through: :user_categories
end

class User < ActiveRecord::Base
  has_many :user_categories
  has_many :categories, through: :user_categories
  has_one :facebook_user
end

class UserCategory < ActiveRecord::Base
  belongs_to :user
  belongs_to :category
end

#single query
FacebookUser.includes( user: :categories).joins(user: :categories).each do |f|
  ## N+1 query on f.categories
  f.categories.first
end

#multi-part query
facebook_user_ids = FacebookUser.where(user_id: [1,2,3]).joins(user: :categories).pluck('facebook_users.id')
FacebookUser.where( id: facebook_user_ids ).includes( user: :categories)

1 个答案:

答案 0 :(得分:1)

FacebookUser.includes( user: :categories)

您已经急切地加载了用户及其类别,而不是facebook_user上的类别。因此,为了避免n + 1查询,请调用

f.user.categories

那你为什么不急于facebook_user的类别?

FacebookUser.includes(:类别)