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!