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')
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!