Cómo actualizar belong_to para trabajar el doble de rápido (gem_validations de base de datos)

En este artículo, le mostraré por qué necesita usar db_belongs_to de la db_belongs_to database_validations en lugar de la habitual belongs_to .


Estoy seguro de que la mayoría de ustedes está familiarizado con belongs_to de ORM ActiveRecord . Pero, ¿sabía usted que inicializar una conexión usando belongs_to en su modelo también agrega validación a la existencia de una conexión? Esto se debe a que belongs_to tiene la optional: false por defecto.


Por lo tanto, cada vez que guarda un nuevo objeto o actualiza uno existente, ejecuta una consulta SQL SELECT adicional para cada uno de sus enlaces.


Ejemplo


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

También debe tener en cuenta que este enfoque no garantiza la integridad de la base de datos, ya que los enlaces se pueden eliminar más tarde (en solicitudes posteriores o paralelas) sin ningún problema.


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

Para resolver este problema, puede agregar la restricción de clave externa correspondiente a su base de datos. Teniendo esta limitación, siempre estará seguro de que existe esta conexión.


¿Qué pasa con el rendimiento? ¿Por qué necesitamos hacer consultas SELECT a la base de datos si ya estamos seguros de que se mantendrá la integridad de los datos (utilizando la restricción de clave externa)?


La respuesta es simple: no es necesario. Pero para que esto sea posible, necesitamos resolver el problema de manejar la excepción ActiveRecord::InvalidForeignKey , que obtenemos cuando intentamos guardar la conexión que no está en la base de datos. Esto es necesario con el fin de tener el mismo comportamiento que belongs_to , para que los errors incluyan los mismos errores.


Para no escribir todo el procesamiento usted mismo, la gema database_validations será útil. Esta gema ya incluía validates_db_uniqueness_of , que le gustó a la gente (una publicación en el centro ) y ahora tiene db_belongs_to , que es muy fácil de implementar en su proyecto. db_belongs_to mejora el rendimiento y garantiza la integridad de los datos.


El método hace algunas cosas por ti:


  • Comprueba la existencia de la restricción de clave externa correcta en la base de datos durante el inicio de la aplicación;
  • Analiza las excepciones de la base de datos y proporciona los errores apropiados para los errors su objeto;
  • Elimina la necesidad de ejecutar consultas SQL adicionales a la base de datos;

Le recomiendo que use database_validations en sus proyectos. Esta gema ya ha sido probada en el entorno de producción y ha demostrado ser muy buena. A pesar de su facilidad de implementación, puede mejorar en gran medida el rendimiento de su proyecto, ya que cuanto más lo use, más ahorrará , consulte los puntos de referencia del grupo para obtener más detalles.


Cualquier comentario es bienvenido! ¡Estamos agradecidos por cualquier contribución al proyecto!

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


All Articles