español - Ruby on Rails: ¿Es mejor validar en el modelo o la base de datos?
ruby on rails ejemplos (6)
¿En general es una mejor práctica (y por qué) validar atributos en el modelo o en la definición de la base de datos?
Para un ejemplo (trivial):
En el modelo de usuario:
validates_presence_of :name
versus en la migración:
t.string :name, :null => false
Por un lado, incluirlo en la base de datos parece ser más una garantía contra cualquier tipo de datos falsos que entren furtivamente. Por otro lado, incluirlo en el modelo hace que las cosas sean más transparentes y fáciles de entender al agruparlo en el código con el resto de las validaciones. También consideré hacer ambas cosas, pero esto parece no ser SECO y menos sostenible.
Depende del diseño de su aplicación. Si tiene una aplicación de tamaño pequeño o mediano, puede hacerlo en ambos o solo en el modelo. Pero si tiene una aplicación grande probablemente orientada a servicios o en capas, entonces tiene una validación básica, es decir obligatoria / nulable, longitud mínima / máxima, etc. en la base de datos y más estrictos, es decir, patrones o reglas comerciales en el modelo.
Es una buena práctica hacer ambas cosas. Validación del modelo es fácil de usar, mientras que la validación de la base de datos agrega un componente de último recurso que endurece su código y revela las validaciones perdidas en la lógica de su aplicación.
Recomendaría el proyecto Migration Validators ( https://rubygems.org/gems/mv-core ) para definir la validación en el nivel db y luego promoverla de forma transparente al modelo ActiveRecord.
Ejemplo:
en la migración:
def change
create_table :posts do |t|
t.string :title, length: 1..30
end
end
en tu modelo:
class Post < ActiveRecord::Base
enforce_migration_validations
end
Como resultado, tendrá una validación de datos de dos niveles. El primero se implementará en db (como condición en el desencadenante de la restricción de verificación) y el segundo como validación de ActiveModel en su modelo.
Recomiendo encarecidamente hacerlo en ambos lugares. Hacerlo en el modelo le ahorra una consulta de la base de datos (posiblemente a través de la red) que esencialmente se equivocará, y hacerlo en la base de datos garantiza la coherencia de los datos.
Varía. Creo que la validación simple, relacionada con los datos (como la longitud de las cadenas, las limitaciones de campo, etc.) debe hacerse en la base de datos. Cualquier validación que esté siguiendo algunas reglas comerciales debe hacerse en el modelo.
Y también
validates_presence_of :name
no es lo mismo
t.string :name, :null => false
Si simplemente establece la columna NOT NULL en su DB, aún puede insertar un valor en blanco (""). Si está utilizando el modelo validates_presence_of, no puede.