Correspondencia entre restricciones y validaciones de la base de datos

Después de un tiempo desde el comienzo del desarrollo de su proyecto, puede notar que tiene inconsistencias entre las restricciones en la base de datos y las validaciones en la aplicación. En este artículo, explico cómo gem database_consistency te ayudará a ordenar tu base de datos.

Discutimos dos situaciones posibles. Código de muestra escrito para ActiveRecord .

Primera situacion


Supongamos que tiene una tabla que se presenta de la siguiente manera:

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

y una clase declarada como:

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

En este caso, la validación se puede ignorar utilizando métodos como: save(validate: false) y, como resultado, se almacenará un valor NULO en la base de datos. En la mayoría de los casos, no querrá que esto suceda (porque instaló la validación). Por lo tanto, sería más correcto tener una restricción distinta de cero en la base de datos.

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

Segunda situación (inversa)


Supongamos que tiene una tabla que se presenta de la siguiente manera:

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

y una clase declarada como:

 class User < ApplicationRecord validates :name end 

En este caso, valid? devolverá true para los registros que no se pueden guardar. Además, un intento de guardar dicho registro en la base de datos ejecutará de una a varias consultas SQL y, en última instancia, devolverá un error, mientras revierte toda la transacción. Todas estas manipulaciones son ineficientes y se pueden resolver fácilmente agregando presence: true validación presence: true . En la mayoría de los casos, debe agregar esta validación.

La pregunta surgió ante mí: ¿cómo encontrar todos estos casos automáticamente?
Te presento mi gema database_consistency . Por el momento, detecta la mayoría de los casos. Como pequeño bono, también le dirá una situación en la que es posible guardar un registro con un valor NULL en una columna con una restricción distinta de cero.

Algunas preguntas permanecen abiertas:

  • ¿Qué otras oportunidades para implementar?
  • ¿Es necesario admitir otros ORM como secuela ?

Pruébelo usted mismo y comparta sus comentarios. Estaría agradecido por cualquier contribución!

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


All Articles