Para la asignación masiva de valores a un modelo ActiveRecord sin guardar, use el assign_attributes
oattributes=
métodos . Estos métodos están disponibles en Rails 3 y posteriores. Sin embargo, hay pequeñas diferencias y problemas relacionados con la versión a tener en cuenta.
Ambos métodos siguen este uso:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
Tenga en cuenta que ninguno de los métodos realizará validaciones o ejecutará devoluciones de llamada; las devoluciones de llamada y la validación sucederán cuandosave
se llame.
Carriles 3
attributes=
difiere ligeramente de assign_attributes
en Rails 3. attributes=
verificará que el argumento que se le haya pasado sea un Hash y regrese inmediatamente si no lo es; assign_attributes
no tiene tal verificación de Hash. Consulte la documentación de la API de asignación de atributos de ActiveRecord paraattributes=
.
El siguiente código no válido fallará silenciosamente simplemente regresando sin establecer los atributos:
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
silenciosamente se comportará como si las asignaciones se hicieran con éxito, cuando en realidad no lo fueron.
Este código no válido generará una excepción cuando assign_attributes
intente stringificar las claves hash de la matriz adjunta:
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
generará una NoMethodError
excepción para stringify_keys
, lo que indica que el primer argumento no es un Hash. La excepción en sí misma no es muy informativa sobre la causa real, pero el hecho de que ocurra una excepción es muy importante.
La única diferencia entre estos casos es el método utilizado para la asignación en masa: attributes=
silenciosamente tiene éxito y assign_attributes
genera una excepción para informar que se ha producido un error.
Estos ejemplos pueden parecer artificiales, y lo son hasta cierto punto, pero este tipo de error puede ocurrir fácilmente al convertir datos de una API, o incluso simplemente usando una serie de transformación de datos y olvidando Hash[]
los resultados finales .map
. Mantenga algunas líneas de código 50 arriba y 3 funciones eliminadas de su asignación de atributos, y tiene una receta para fallar.
La lección con Rails 3 es esta: siempre use en assign_attributes
lugar de attributes=
.
Carriles 4
En Rails 4, attributes=
es simplemente un alias para assign_attributes
. Consulte la documentación de la API de asignación de atributos de ActiveRecord paraattributes=
.
Con Rails 4, cualquiera de los métodos se puede usar indistintamente. No pasar un hash como primer argumento dará como resultado una excepción muy útil:ArgumentError: When assigning attributes, you must pass a hash as an argument.
Validaciones
Si está realizando un vuelo previo a las tareas en preparación para una save
, también podría estar interesado en validar antes de guardar. Puede usar los métodos valid?
y invalid?
para esto. Ambos devuelven valores booleanos. valid?
devuelve verdadero si el modelo no guardado pasa todas las validaciones o falso si no lo hace. invalid?
es simplemente el inverso devalid?
valid?
se puede usar así:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
Esto le dará la capacidad de manejar cualquier problema de validación antes de llamar save
.