In diesem Artikel werde ich zeigen, warum Sie db_belongs_to
aus dem db_belongs_to
database_validations anstelle des üblichen belongs_to
.
Ich bin sicher, die meisten von Ihnen kennen belongs_to
von ORM belongs_to
. belongs_to
Sie jedoch, dass das Initialisieren einer Verbindung mit belongs_to
in Ihrem Modell auch das Vorhandensein einer Verbindung validiert belongs_to
Dies liegt daran, dass belongs_to
standardmäßig die Option optional: false
.
Jedes Mal, wenn Sie ein neues Objekt speichern oder ein vorhandenes aktualisieren, führen Sie für jeden Ihrer Links eine zusätzliche SQL SELECT-Abfrage aus.
Beispiel
class User < ActiveRecord::Base belongs_to :company belongs_to :country end user = User.first user.update(some_field: 'something')
Sie sollten sich auch darüber im Klaren sein, dass dieser Ansatz die Datenbankintegrität nicht garantiert Links können später (bei nachfolgenden oder parallelen Anfragen) problemlos gelöscht werden.
user.update(...) user.company.destroy! => , , , ( )
Um dieses Problem zu lösen, können Sie Ihrer Datenbank die entsprechende Fremdschlüsseleinschränkung hinzufügen. Mit dieser Einschränkung können Sie immer sicher sein, dass diese Verbindung besteht.
Was ist mit Leistung? Warum müssen wir SELECT-Abfragen an die Datenbank durchführen, wenn wir bereits sicher sind, dass die Datenintegrität erhalten bleibt (unter Verwendung der Fremdschlüsseleinschränkung)?
Die Antwort ist einfach - keine Notwendigkeit. Um dies zu ermöglichen, müssen wir das Problem der Behandlung der ActiveRecord::InvalidForeignKey
Ausnahme lösen, die wir erhalten, wenn wir versuchen, die Verbindung zu speichern, die sich nicht in der Datenbank befindet. Dies ist erforderlich, um das gleiche Verhalten wie bei belongs_to
, damit errors
dieselben Fehler enthalten.
Um nicht die gesamte Verarbeitung selbst zu schreiben, ist das Juwel database_validations hilfreich. Dieses Juwel enthielt bereits validates_db_uniqueness_of
, das den Leuten gefallen hat (ein Beitrag auf dem Hub ), und hat jetzt db_belongs_to
, was sehr einfach in Ihrem Projekt zu implementieren ist. db_belongs_to
verbessert die Leistung und stellt die Datenintegrität sicher.
Die Methode erledigt einige Dinge für Sie:
- Überprüft beim Start der Anwendung, ob in der Datenbank die richtige Fremdschlüsseleinschränkung vorhanden ist.
- Analysiert Datenbankausnahmen und stellt geeignete Fehler für die
errors
Ihres Objekts bereit. - Beseitigt die Notwendigkeit, zusätzliche SQL-Abfragen an die Datenbank auszuführen.
Ich empfehle Ihnen, database_validations in Ihren Projekten zu verwenden. Dieses Juwel wurde bereits in der Produktionsumgebung getestet und hat sich als sehr gut erwiesen. Trotz seiner einfachen Implementierung kann es die Leistung Ihres Projekts erheblich verbessern Je häufiger Sie es verwenden, desto mehr sparen Sie. Weitere Informationen finden Sie in den Gruppen-Benchmarks .
Jedes Feedback ist willkommen! Wir sind für jeden Beitrag zum Projekt dankbar!