Correspondance entre contraintes de base de données et validations

Après un certain temps depuis le début du développement de votre projet, vous pouvez remarquer que vous avez des incohérences entre les restrictions dans la base de données et les validations dans l'application. Dans cet article, j'explique comment gem database_consistency vous aidera à ranger votre base de données.

Nous discutons de deux situations possibles. Exemple de code écrit pour ActiveRecord .

Première situation


Supposons que vous ayez un tableau qui se présente comme suit:

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

et une classe déclarée comme:

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

Dans ce cas, la validation peut être ignorée à l'aide de méthodes telles que: save(validate: false) et, par conséquent, une valeur NULL sera stockée dans la base de données. Dans la plupart des cas, vous ne voudriez pas que cela se produise (car vous avez installé la validation). Ainsi, il serait plus correct d'avoir une restriction non nulle dans la base de données.

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

Deuxième situation (inverse)


Supposons que vous ayez un tableau qui se présente comme suit:

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

et une classe déclarée comme:

 class User < ApplicationRecord validates :name end 

Dans ce cas, valid? renvoie true pour les enregistrements qui ne peuvent pas être enregistrés. De plus, une tentative de sauvegarde d'un tel enregistrement dans la base de données exécutera d'une à plusieurs requêtes SQL et, en fin de compte, renverra une erreur, tout en annulant la transaction entière. Toutes ces manipulations sont inefficaces et peuvent être facilement résolues en ajoutant de la presence: true validation. Dans la plupart des cas, vous devez ajouter cette validation.

La question s'est posée devant moi: comment retrouver automatiquement tous ces cas?
Je vous présente ma gem database_consistency . Pour le moment, il détecte la plupart des cas. En guise de petit bonus, il vous indiquera également une situation où il est possible de sauvegarder un enregistrement avec une valeur NULL dans une colonne avec une restriction non nulle.

Certaines questions restent ouvertes:

  • Quelles autres opportunités à mettre en œuvre?
  • Est-il nécessaire de prendre en charge d'autres ORM comme la suite ?

Essayez-le vous-même et partagez vos commentaires. Je serais reconnaissant pour toute contribution!

Source: https://habr.com/ru/post/fr431294/


All Articles