Paul
Paul

Reputation: 2031

N + 1 Queries even with Eager loading in Rails 3.2

I have a has_many through, through relationship that needs to be eagerly loaded. Is this possible in Rails 3.2? I've tried several ways to include the association yet calling categories on the facebook_user object always makes another query to Category. Here's a simplified version of my activerecord associations.

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)

Upvotes: 0

Views: 86

Answers (1)

dre-hh
dre-hh

Reputation: 8044

With

FacebookUser.includes( user: :categories)

you have eager loaded the user and his categories instead of the categories on facebook_user. So in order to avoid n+1 query you call then

f.user.categories

So why u just don't eager facebook_user's categories?

FacebookUser.includes(:categories)

Upvotes: 1

Related Questions