Rails: update_attribute vs update_attributes

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 de validación normal. Esto es especialmente útil para indicadores booleanos en registros existentes. El método update_attribute regular en Base se reemplaza por este cuando el módulo de validaciones está mezclado, que es por defecto.

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 que el objeto sea validado, debería usar update_attribute. ¿Qué pasa si tengo esta actualización en un before_save? ¿Stackoverflow?

Mi pregunta es: update_attribute también omite el antes de guardar o solo la validación.

Además, ¿cuál es la syntax correcta para pasar un hash a los atributos de actualización? Mira mi ejemplo en la parte superior.

Por favor, consulte update_attribute . Al hacer clic en show source obtendrás el siguiente código

  # File vendor/rails/activerecord/lib/active_record/base.rb, line 2614 2614: def update_attribute(name, value) 2615: send(name.to_s + '=', value) 2616: save(false) 2617: end 

y ahora refiera los update_attributes y mire su código que obtiene

  # File vendor/rails/activerecord/lib/active_record/base.rb, line 2621 2621: def update_attributes(attributes) 2622: self.attributes = attributes 2623: save 2624: end 

la diferencia entre dos es update_attribute usa save(false) mientras que update_attributes usa save o puede decir save(true) .

Perdón por la larga descripción, pero lo que quiero decir es importante. save(perform_validation = true) , si perform_validation es false omite (salta será la palabra correcta) todas las validaciones asociadas con save .

Para la segunda pregunta

Además, ¿cuál es la syntax correcta para pasar un hash a los atributos de actualización? Mira mi ejemplo en la parte superior.

Tu ejemplo es correcto

 Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3") 

o

 Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3" 

o si obtiene todos los campos de datos y nombre en un hash decir params[:user] aquí use simplemente

 Object.update_attributes(params[:user]) 

Consejo: update_attribute está en desuso en Rails 4 a través de Commit a7f4b0a1 . Elimina update_attribute a favor de update_column .

atributo_actualización

Este método actualiza un solo atributo del objeto sin invocar la validación basada en el modelo.

 obj = Model.find_by_id(params[:id]) obj.update_attribute :language, “java” 

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.

 attributes = {:name => “BalaChandar”, :age => 23} obj = Model.find_by_id(params[:id]) obj.update_attributes(attributes) 

Espero que esta respuesta aclare cuándo utilizar qué método de registro activo.

También vale la pena señalar que con update_attribute , el atributo deseado que se actualizará no necesita ser listado en blanco con attr_accessible para actualizarlo en comparación con el método de asignación masiva update_attributes que solo actualizará attr_accessible especificados attr_accessible .

Grandes respuestas. note que en cuanto a ruby ​​1.9 y superior usted podría (y creo que debería) usar la nueva syntax hash para update_attributes:

 Model.update_attributes(column1: "data", column2: "data") 

update_attribute simplemente actualiza solo un atributo de un modelo, pero podemos pasar múltiples atributos en el método update_attributes .

Ejemplo:

 user = User.last #update_attribute user.update_attribute(:status, "active") 

Pasa la validación

 #update_attributes user.update_attributes(first_name: 'update name', status: "active") 

no se actualiza si la validación falla.

Puede que le interese visitar esta publicación de blog sobre todas las formas posibles de asignar un atributo o registro de actualización (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, el toque de la actualización del objeto o la activación de devoluciones de llamada.

Como respuesta a la pregunta del OP update_attribute no pasa devoluciones de llamada.

Para responder a su pregunta, update_attribute omite las “validaciones” previas al guardado, pero aún ejecuta otras devoluciones de llamada como after_save etc. Por lo tanto, si realmente desea “actualizar la columna y omitir cualquier cruzamiento AR”, deberá usar (al parecer)

Model.update_all(...) ver https://stackoverflow.com/a/7243777/32453

Recientemente me encontré con update_attribute vs. update_attributes y el problema de validación, por lo que los nombres similares, por lo que el comportamiento diferente, tan confuso.

Para pasar hash a update_attribute y bypass validation puedes hacer:

 object = Object.new object.attributes = { field1: 'value', field2: 'value2', field3: 'value3' } object.save!(validate: false) 

update_attribute y update_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.

     Model.update_attribute(:column_name, column_value1) 
  • update_attributes se usa para actualizar el registro con múltiples atributos.

     Model.update_attributes(:column_name1 => column_value1, :column_name2 => column_value2, ...) 

Estos dos métodos son realmente fáciles de confundir dado sus nombres y trabajos similares. Por lo tanto, update_attribute se elimina a favor de update_column .

Ahora, en Rails4 puede usar Model.update_column(:column_name, column_value) en el lugar de Model.update_attribute(:column_name, column_value)

Haga clic aquí para obtener más información sobre update_column .

Creo que su pregunta es si tener un atributo_actualización en un before_save dará lugar a un ciclo infinito (de llamadas update_attribute en callbacks before_save, originalmente activadas por una llamada update_attribute)

Estoy bastante seguro de que omite la callback before_save, ya que en realidad no guarda el registro. También puede guardar un registro sin activar validaciones mediante el uso de

Model.save false

Intereting Posts