Todos los hackers que han trabajado con
Ruby On Rails están familiarizados con
ORM ActiveRecord . Discutiremos una de las validaciones propuestas desde el cuadro, a saber, validaciones para la unicidad, y por qué
database_validations gem guardará la consistencia de su base de datos.
Supongamos que tiene un modelo de usuario con unicidad en el campo del
correo electrónico , es decir.
class User < ApplicationRecord validates :email, uniqueness: true end
Es posible que ya sepa que esta validación realiza la siguiente solicitud
SELECT 1 FROM users WHERE email = $1
cada vez que intentamos guardar un registro en la base de datos.
Este enfoque tiene varias desventajas:
En primer lugar , la ejecución de una solicitud adicional, y si se inicializan varias validaciones de unicidad en el modelo, la solicitud se ejecutará para cada una de ellas. Esto no es eficiente y también requiere índices si queremos que estas consultas se ejecuten rápidamente.
En segundo lugar , esta solución no garantiza la unicidad debido a una posible
carrera por los datos . Varias operaciones competitivas pueden aprender simultáneamente sobre la ausencia de un registro específico, como resultado de lo cual, para mantener los mismos datos.
Por supuesto, los casos raros con carrera de datos se pueden resolver agregando una restricción de unicidad a nivel de base de datos. Pero en este caso, no obtendrá un error de validación, la consulta a la base de datos simplemente caerá y toda la transacción se revertirá.
En esta situación, la gema
database_validations ayudará, lo que proporciona compatibilidad entre las restricciones y validaciones de la base de datos.
El significado principal de gem se presenta en el siguiente código:
def save(options = {}) ActiveRecord::Base.connection.transaction(requires_new: true) { super } rescue ActiveRecord::RecordNotUnique => e Helpers.handle_unique_error!(self, e) false end
Por lo tanto, intentamos guardar los datos, si se pasan todas las demás validaciones, si la transacción cae y retrocede, analizamos el error y asignamos los valores correctos a los
errors
nuestro objeto.
Después de revisar la
documentación y los
puntos de referencia , podemos concluir que esta gema acelerará el proceso de guardar registros en la base de datos al menos dos veces.
Gracias al soporte de bases de datos como
PostgreSQL ,
SQLite ,
MySQL y la compatibilidad con
validates_uniqueness_of
, el proceso de reemplazo con
validates_db_uniqueness_of
lleva unos minutos.
Un práctico emparejador para RSpec también está presente de fábrica:
specify do expect(described_class) .to validate_db_uniqueness_of(:field) .with_message('duplicate') .with_where('(some_field IS NULL)') .scoped_to(:another_field) .with_index(:unique_index) end
Al cambiar a una nueva validación, debe tener restricciones sobre la unicidad en la base de datos, pero si aún no están allí, gem lo indicará cuando se inicie la aplicación.
La gema se probó en una aplicación con más de 100 validaciones para la unicidad entre más de 50 modelos.
Usa gema y comparte tu opinión. ¡Cualquier contribución a un mayor desarrollo es bienvenida!