如何在 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
在 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