Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Ambos actualizarán un objeto sin tener que decirle explícitamente a AR que actualice.
Rails API dice:
para update_attribute
Actualiza un solo atributo y guarda el registro sin pasar por el procedimiento normal de validación. Esto es especialmente útil para banderas booleanas en registros existentes. El método regular update_attribute en Base se reemplaza por esto cuando se mezcla el módulo de validaciones, que es el predeterminado.
para update_attributes
Actualiza todos los atributos del hash pasado y guarda el registro. Si el objeto no es válido, el guardado fallará y se devolverá falso.
Entonces, si no quiero validar el objeto, debería usar update_attribute. ¿Qué pasa si tengo esta actualización en un before_save, se apilará?
Mi pregunta es ¿update_attribute también omite el guardado anterior o solo la validación?
Además, ¿cuál es la sintaxis correcta para pasar un hash a update_attributes ... mira mi ejemplo en la parte superior.
fuente
update_attribute
declaración dentro de unabefore_save
devolución de llamada? No puedo pensar en una buena razón para esto.before_save
devolución de llamada). Fe en lugar deupdate_attribute(:discount, 0.1) if amount > 100
ti podría hacerdiscount = 0.1 if amount > 100
.update_attribute
invocasave
el objeto, lo cual es innecesario en este caso, ya que la declaración está dentro de unabefore_save
devolución de llamada y se guardará de todos modos. Espero que tenga sentido.Respuestas:
Por favor refiérase a
update_attribute
. Al hacer clic en mostrar fuente, obtendrá el siguiente códigoy ahora
update_attributes
consulta y mira su código que obtienesla diferencia entre dos es
update_attribute
usos,save(false)
mientras queupdate_attributes
usossave
o se puede decirsave(true)
.Perdón por la larga descripción, pero lo que quiero decir es importante.
save(perform_validation = true)
, siperform_validation
es falso, omite (omitir será la palabra adecuada) todas las validaciones asociadas consave
.Para la segunda pregunta
Tu ejemplo es correcto.
o
o si obtiene todos los datos y nombre de los campos en un hash, diga
params[:user]
aquí, use solofuente
Rails 3
. Dice muy claramente en los comentarios en la fuente que "se invocan devoluciones de llamada".update_attributes
ahora es un alias paraupdate
Sugerencia:
update_attribute
está en desuso en Rails 4 a través de Commit a7f4b0a1 . Se eliminaupdate_attribute
a favor deupdate_column
.fuente
update_attribute
omite la validación, pero respeta las devoluciones de llamada,update_column
omitirá tanto la validación como las devoluciones de llamada y no se actualizará:updated_at
,update
es la función normal que respetará tanto las devoluciones de llamada como la validaciónupdate_column
no está en desuso, peroupdate_columns(name: value)
es favorecido.reset_column
ha sido removido.atributo_actualización
Este método actualiza el atributo único del objeto sin invocar la validación basada en el modelo.
atributos_actualización
Este método actualiza múltiples atributos de un solo objeto y también pasa la validación basada en el modelo.
Espero que esta respuesta aclare cuándo usar qué método de registro activo.
fuente
También vale la pena señalar que con
update_attribute
, el atributo deseado que se actualizará no necesita estar en una lista blancaattr_accessible
para actualizarlo en lugar del método de asignación masivaupdate_attributes
que solo actualizaráattr_accessible
los atributos especificados.fuente
update_attribute
simplemente actualiza solo un atributo de un modelo, pero podemos pasar múltiples atributos en elupdate_attributes
método.Ejemplo:
Pasa la validación
no se actualiza si falla la validación.
fuente
Grandes respuestas tenga en cuenta que en cuanto a ruby 1.9 y superior, podría (y creo que debería) usar la nueva sintaxis hash para update_attributes:
fuente
Es posible que le interese visitar esta publicación de blog sobre todas las formas posibles de asignar un atributo o actualizar el registro (actualizado a Rails 4)
update_attribute, update, update_column, update_columns etc.
http://www.davidverhasselt.com/set-attributes-in-activerecord/ . Por ejemplo, difiere en aspectos como la ejecución de validaciones, tocar el objeto updated_at del objeto o activar devoluciones de llamada.Como respuesta a la pregunta del OP,
update_attribute
no pasa las devoluciones de llamada.fuente
update_attribute
yupdate_attributes
son similares, pero con una gran diferencia:update_attribute
no ejecuta validaciones.También:
update_attribute
se usa para actualizar el registro con un solo atributo.update_attributes
se utiliza para actualizar registros con múltiples atributos.Estos dos métodos son realmente fáciles de confundir dados sus nombres y trabajos similares. Por lo tanto,
update_attribute
se está eliminando a favor deupdate_column
.Ahora, en Rails4 puedes usarlo
Model.update_column(:column_name, column_value)
en el lugar deModel.update_attribute(:column_name, column_value)
Haga clic aquí para obtener más información sobre
update_column
.fuente
Para responder a su pregunta,
update_attribute
omite las "validaciones" previas al guardado, pero aún ejecuta otras devoluciones de llamada comoafter_save
etc. Así que si realmente desea "simplemente actualizar la columna y omitir cualquier desmoronamiento AR", entonces debe usar (aparentemente)Model.update_all(...)
ver https://stackoverflow.com/a/7243777/32453fuente
Recientemente me encontré con el problema de
update_attribute
vsupdate_attributes
y validación, nombres muy similares, comportamiento tan diferente, tan confuso.Para pasar el hash
update_attribute
y omitir la validación, puede hacer:fuente
Creo que su pregunta es si tener un atributo update_attribute en before_save conducirá a un bucle sin fin (de llamadas update_attribute en devoluciones de llamada before_save, originalmente activadas por una llamada update_attribute)
Estoy bastante seguro de que omite la devolución de llamada before_save ya que en realidad no guarda el registro. También puede guardar un registro sin activar validaciones utilizando
Model.save false
fuente