[RAILS] Strict_loading-Funktion zur Unterdrückung des Auftretens von N + 1-Problemen, die von Schienen hinzugefügt wurden 6.1

Nachdem Rails 6.1rc veröffentlicht wurde, haben wir eine neue Funktion zusammengestellt, die Funktion "strict_loading". See: https://weblog.rubyonrails.org/releases/

  1. #strict_loading

Durch Markieren eines Objekts wird die Ausnahme "ActiveRecord :: StrictLoadingViolationError" ausgelöst, wenn das Objekt mit einer Zuordnungsverzögerung geladen wird.

$ dev = Developer.strict_loading.first
$ dev.audit_logs.to_a
=> ActiveRecord::StrictLoadingViolationError: Developer is marked as strict_loading and AuditLog cannot be lazily loaded.

See: https://github.com/rails/rails/pull/37400

  1. has_many :projects, strict_loading: true So legen Sie die Zuordnungsoption fest. Alle angegebenen Zuordnungen lösen beim verzögerten Laden die Ausnahme "ActiveRecord :: StrictLoadingViolationError" aus.
class Developer < ApplicationRecord
  has_many :projects, strict_loading: true
end

dev = Developer.first
dev.projects.first
# => ActiveRecord::StrictLoadingViolationError: The projects association is marked as strict_loading and cannot be lazily loaded.

See: https://github.com/rails/rails/pull/38541

  1. self.strict_loading_by_default = true Angabe nach Modell. Alle Zuordnungen aus dem gesamten angegebenen Modell lösen beim verzögerten Laden die Ausnahme "ActiveRecord :: StrictLoadingViolationError" aus.
class Developer < ApplicationRecord
  self.strict_loading_by_default = true

  has_many :projects
end

dev = Developer.first
dev.projects.first
# => ActiveRecord::StrictLoadingViolationError Exception: Developer is marked as strict_loading and Project cannot be lazily loaded.

See: https://github.com/rails/rails/pull/39491

Andere

Es ist jetzt möglich, die Protokollausgabe sowie das Auftreten von Ausnahmen im Verhalten auszuwählen, wenn strict_loding erkannt wird.

config.active_record.action_on_strict_loading_violation enables raising or logging an exception if strict_loading is set on an association. The default value is :raise in all environments. It can be changed to :log to send violations to the logger instead of raising.

config.active_record.action_on_strict_loading_violation = :log

See https://github.com/rails/rails/pull/40511 https://edgeguides.rubyonrails.org/configuring.html#configuring-active-record

Dies ermöglicht es, eine Ausnahme in der Entwicklungs- und Testumgebung auszulösen und die Protokollausgabe in der Produktionsumgebung beizubehalten.

Diskussion bei WTF

Die Community diskutiert auch aktiv Möglichkeiten, um das Auftreten von N + 1 zu verhindern. https://discuss.rubyonrails.org/t/n-1-queries-should-be-the-exception-not-the-easy-trap-to-fall-in/74537/14

Recommended Posts

Strict_loading-Funktion zur Unterdrückung des Auftretens von N + 1-Problemen, die von Schienen hinzugefügt wurden 6.1
Schaltfläche [Schienen], um zum Anfang der Seite zurückzukehren
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
[Rails] Implementierungsverfahren, wenn der Buchungsfunktion öffentliche / private Funktionen hinzugefügt werden
Wie schreibe ich Scala aus der Perspektive von Java
[Anfänger] Entdecken Sie das N + 1-Problem! Wie benutzt man Bullet?
[Rails] So ändern Sie den Spaltennamen der Tabelle
[Rails] So erhalten Sie den Inhalt starker Parameter
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Über die Funktion von Spring Boot aufgrund unterschiedlicher Versionen
Kommen Sie zu den Abkürzungen aus den fünf Beispielen für kursive Java-Listen
Ein Hinweis zum Seed-Feature von Ruby on Rails
So erhalten Sie die längsten Informationen von Twitter ab dem 12.12.2016
[Rails] Funktion zum Suchen und Auflisten von Produkten aus mehrstufigen Kategorien
[Rails] So zeigen Sie eine Liste der Beiträge nach Kategorie an
[Rails] Bei der Beschreibung der Validierung ist Vorsicht geboten
Vermeiden Sie das Problem, dass beim Upgrade von Rails 4.2.x auf 5.0.x keine Sitzung abgerufen werden kann, wenn Canary freigegeben wird.
Unterschätzen Sie das N + 1-Problem nicht!
[Rails] Implementierung der Kategoriefunktion
Schienen ~ Die Nachrichtenfunktion verstehen ~
[Rails] Implementierung der Tutorial-Funktion
[Rails] Implementierung einer ähnlichen Funktion
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
[Rails] So erhalten Sie die URL der Übergangsquelle und leiten sie um
[Rails] Unterdrücken Sie nutzloses SQL, indem Sie die Cache-Steuerung von Zuordnungen verwenden
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Möchten Sie wissen, was Ruby n die Potenz von 2 ist? (Machturteil von 2)
[Rails / Heroku / MySQL] So setzen Sie die Datenbank der Rails-App auf Heroku zurück
[Rails] Sprechen Sie darüber, wie Sie auf den Rückgabewert von where achten
[Rails] So lassen Sie die Anzeige der Zeichenfolge der link_to-Methode weg
[Schienen] So ändern Sie den Seitentitel des Browsers für jede Seite
[Rails] Lesen Sie das RSS der Site und geben Sie den Inhalt an die Vorderseite zurück
Vom jungen Java (3 Jahre) bis zu Node.js (4 Jahre). Und der Eindruck, nach Java zurückzukehren
Ich habe versucht, das Paiza-Kampagnenproblem "Herausforderung von Phantomdieb 813" zu lösen.
(Ruby on Rails6) Erstellen Sie eine Funktion zum Bearbeiten des veröffentlichten Inhalts
Ich habe versucht, das Problem des Google Tech Dev Guide zu lösen
[Mit einer Erklärung, warum dies zu tun ist] So verhindern Sie, dass andere Benutzer mit der CRUD-App von Rails mit Authentifizierungsfunktion bearbeiten
[Rails] Implementierungsverfahren der Funktion zum Markieren von Posts ohne Gem + die Funktion zum Eingrenzen und Anzeigen von Posts nach Tags