如何在 Rails 上用 Ruby 解决 "N+1"

How to solve "N+1" with Ruby on Rails

在 Rails 上使用 Ruby 创建 Web 应用程序。
在这中间,出现了N+1的问题,我已经试过了eager_load,但是没有解决问题。
如果您能告诉我解决方案,我将不胜感激。

# companies_controller.rb

companies = Company.with_include_users
users = User.with_include_company

companies.each do |company|
  ActiveRecord::Base.transaction do
    target_user = users.where(id: company.id)
    pp target_user
  end
end
# company.rb

has_many :users
scope :with_include_users, -> {
  eager_load(:users)
}
# user.rb

belongs_to :company
scope :with_include_company, -> {
  joins(:company).eager_load(:company)
}

如上图,我们eager_load在model和outer join。其实一直没有解决

为了解决 n+1 问题,如果您知道必须在您的视图中使用它们,您可以使用方法 includes 直接获取您的关联对象。

(下面未经测试的代码)

# companies_controller.rb

companies = Company.includes(:users)

companies.each do |company|
  company.users.each do |user|
    pp user
  end
end