Comment mettre à niveau l'appart_to pour fonctionner deux fois plus vite (gem de database_validations)

Dans cet article, je montrerai pourquoi vous devez utiliser db_belongs_to partir de la db_belongs_to database_validations au lieu de l'habituel l' belongs_to .


Je suis sûr que la plupart d'entre vous connaissent l' belongs_to à ORM ActiveRecord . Mais saviez-vous que l'initialisation d'une connexion à l'aide de l' belongs_to à votre modèle ajoute également la validation de l'existence d'une connexion. Cela est dû belongs_to fait belongs_to a l' optional: false par défaut.


Ainsi, chaque fois que vous enregistrez un nouvel objet ou mettez à jour un objet existant, vous exécutez une requête SQL SELECT supplémentaire pour chacun de vos liens.


Exemple


 class User < ActiveRecord::Base belongs_to :company belongs_to :country end user = User.first user.update(some_field: 'something') #        SELECT,  ,   `company`  `country`  

Vous devez également savoir que cette approche ne garantit pas l'intégrité de la base de données, car les liens peuvent être supprimés ultérieurement (dans des requêtes ultérieures ou parallèles) sans aucun problème.


 user.update(...) user.company.destroy! =>     ,  ,          ,       (     ) 

Pour résoudre ce problème, vous pouvez ajouter la contrainte de clé étrangère correspondante à votre base de données. Ayant cette limitation, vous serez toujours sûr que cette connexion existe.


Et la performance? Pourquoi devons-nous effectuer des requêtes SELECT dans la base de données si nous sommes déjà sûrs que l'intégrité des données sera maintenue (en utilisant la contrainte de clé étrangère)?


La réponse est simple - pas besoin. Mais pour rendre cela possible, nous devons résoudre le problème de la gestion de l'exception ActiveRecord::InvalidForeignKey , que nous obtenons lorsque nous essayons d'enregistrer la connexion qui n'est pas dans la base de données. Ceci est nécessaire pour avoir le même comportement qu'avec l' belongs_to , afin que les errors incluent les mêmes erreurs.


Afin de ne pas écrire tout le traitement vous-même, la gem de database_validations sera utile. Ce joyau incluait déjà validates_db_uniqueness_of , que les gens aimaient (un post sur le hub ) et a maintenant db_belongs_to , qui est très facile à implémenter dans votre projet. db_belongs_to améliore les performances et garantit l'intégrité des données.


La méthode fait quelques choses pour vous:


  • Vérifie l'existence de la contrainte de clé étrangère correcte dans la base de données lors du démarrage de l'application;
  • Analyse les exceptions de base de données et fournit les erreurs appropriées pour les errors votre objet;
  • Élimine le besoin d'exécuter des requêtes SQL supplémentaires dans la base de données;

Je vous recommande d'utiliser database_validations dans vos projets. Ce bijou a déjà été testé dans l'environnement de production et s'est révélé très bon. Malgré sa facilité de mise en œuvre, il peut grandement améliorer les performances de votre projet, comme plus vous l'utilisez, plus vous économisez , consultez les repères de groupe pour plus de détails.


Toute rétroaction est la bienvenue! Nous sommes reconnaissants pour toute contribution au projet!

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


All Articles