Korrespondenz zwischen Datenbankeinschränkungen und Validierungen

Nach einiger Zeit ab Beginn der Entwicklung Ihres Projekts stellen Sie möglicherweise fest, dass Inkonsistenzen zwischen den Einschränkungen in der Datenbank und den Überprüfungen in der Anwendung bestehen. In diesem Artikel erkläre ich, wie gem database_consistency Ihnen beim Aufräumen Ihrer Datenbank hilft.

Wir diskutieren zwei mögliche Situationen. Beispielcode für ActiveRecord .

Erste Situation


Angenommen, Sie haben eine Tabelle, die wie folgt dargestellt wird:

create_table :users do |t|
  t.string :name
end

und eine Klasse deklariert als:

class User < ApplicationRecord
  validates :name, presence: true
end

In diesem Fall kann die Validierung mit folgenden Methoden ignoriert werden: save(validate: false)Als Ergebnis wird ein NULL- Wert in der Datenbank gespeichert. In den meisten Fällen möchten Sie dies nicht (weil Sie die Validierung installiert haben). Daher wäre es richtiger, wenn die Datenbank eine Einschränkung ungleich Null enthält.

create_table :users do |t|
  t.string :name, null: false
end

Die zweite Situation (umgekehrt)


Angenommen, Sie haben eine Tabelle, die wie folgt dargestellt wird:

create_table :users do |t|
  t.string :name, null: false
end

und eine Klasse deklariert als:

class User < ApplicationRecord
  validates :name
end

In diesem Fall valid?wird ein Wert truefür Einträge zurückgegeben, die nicht gespeichert werden können. Darüber hinaus wird ein Versuch, einen solchen Datensatz in der Datenbank zu speichern, von einer bis zu mehreren SQL-Abfragen ausgeführt und schließlich ein Fehler zurückgegeben, während die gesamte Transaktion rückgängig gemacht wird. Alle diese Manipulationen sind ineffektiv und können durch Hinzufügen einer Validierung einfach behoben werden presence: true. In den meisten Fällen sollten Sie diese Validierung hinzufügen.

Vor mir stellte sich die Frage, wie man solche Fälle automatisch findet.
Ich präsentiere Ihnen meine gem database_consistency . Im Moment erkennt es die meisten Fälle. Als kleinen Bonus wird er Ihnen auch eine Situation mitteilen, in der es möglich ist, einen Datensatz mit einem NULL- Wert in einer Spalte mit einer Einschränkung ungleich Null zu speichern .

Einige Fragen bleiben offen:


Probieren Sie es aus und teilen Sie Ihr Feedback. Für jeden Beitrag wäre ich dankbar!

Jetzt auch beliebt: