我有一个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)
答案 0 :(得分:1)
用
FacebookUser.includes( user: :categories)
您已经急切地加载了用户及其类别,而不是facebook_user上的类别。因此,为了避免n + 1查询,请调用
f.user.categories
那你为什么不急于facebook_user的类别?
FacebookUser.includes(:类别)