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!