【问题标题】:N + 1 Queries even with Eager loading in Rails 3.2即使在 Rails 3.2 中急切加载 N + 1 个查询
【发布时间】:2014-09-18 00:33:12
【问题描述】:

我有一个has_many through,需要急切加载的关系。这在 Rails 3.2 中可行吗?我尝试了几种方法来包含关联,但在 facebook_user 对象上调用类别总是对类别进行另一个查询。这是我的 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)

【问题讨论】:

    标签: ruby-on-rails-3 activerecord


    【解决方案1】:

    FacebookUser.includes( user: :categories)
    

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

    f.user.categories
    

    那么为什么你只是不渴望 facebook_user 的类别呢?

    FacebookUser.includes(:categories)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多