【问题标题】:Eager Load indirect associations RailsEager Load 间接关联 Rails
【发布时间】:2015-07-06 04:47:29
【问题描述】:

关联如下:

#app/models/pet.rb
class Pet < ActiveRecord::Base
  belongs_to :pet_store
end

#app/models/pet_store.rb
class PetStore < ActiveRecord::Base
    has_many :pets, dependent: :destroy
    has_many :employees, dependent: :destroy
end

#app/models/employee.rb
class Employee < ActiveRecord::Base
  belongs_to :pet_store
end

我想做这样的事情,这会导致N + 1 错误:

@pets = Pet.where(species: "Dog").includes(:pet_store)
@pets.each do |pet|
  pet.pet_store.employees.each do |employee|
    puts employee.name
  end
end

这会导致 N+1 错误,因为必须对每个 employee 进行查询。我想eager load 间接关联employees。但是,我不能简单地includes(:employees),因为petemployees 没有直接关联。如何做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    你可以:

    @pets = Pet.includes(:pet_store => :employees)
    

    Rails 查询语言指南很棒。这是docs on eager-loading

    【讨论】:

    • 都不是必须的,你可以直接做@pets = Pet.includes(:pet_store =&gt; :employees)
    • 我可以在视图中使用它吗?因为我尝试了没有运气stackoverflow.com/questions/42606013/…
    • 你可以,但如果你能提供帮助,你不应该在视图中加载数据。看起来您的问题可能是attr_accessor(我已将其添加为对您问题的评论)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2011-05-29
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多