Die Anzahl der ausgegebenen SQLs steigt proportional zur Anzahl der zu verarbeitenden Daten. Dieses Problem wirkt sich auf die Leistung aus und sollte behoben werden. Als Analogie höre ich oft, dass das N + 1-Problem darin besteht, dass Sie beim Kauf vieler Produkte zum Einkaufen nur für jeden Artikel bezahlen.
Es ist eine Bibliothek, die "N + 1 Probleme" findet.
Gemfile
group :development do
gem 'bullet'
end
Bundle installieren. Einstellen.
config/environments/development.rb
Rails.application.configure do
#Unterwegs weggelassen
config.after_initialize do
Bullet.enable = true #Aktiviere Bullet Gem
Bullet.alert = true #Popup-JavaScript-Warnung im Browser
Bullet.bullet_logger = true #Aufzählungsprotokolldatei (Rails.root/log/bullet.Log)
Bullet.console = true #Warnung Browser-Konsole.Im Protokoll aufzeichnen
Bullet.rails_logger = true #Fügen Sie Warnungen direkt zu Rails-Protokollen hinzu
end
end
Wenn Sie eine Kugel verwenden, werden ein Warnbildschirm und ein Protokoll angezeigt.
Stellen Sie beispielsweise die Beziehung zwischen Benutzern und Posts eins zu viele ein.
user.rb
class User < ApplicationRecord
has_many :posts
end
post.rb
class Post < ApplicationRecord
belongs_to :user
end
Gibt den Benutzernamen für alle Beiträge aus.
Post.all.each do |post|
puts post.user.name
end
USE eager loading detected
Psot => [:user]
Add to your finder::incluedes => [:user]
Sie sehen solche Protokolle und Warnmeldungen. Deshalb,
Post.inculudes(:user).each do |post|
puts post.user.name
end
Wenn ja, ist es OK.
Recommended Posts