2010-05-06 14 views
232
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.Rieles: atributo_actualización frente a atributos_actualización

rieles 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 de la pasado-en Hash y guarda el registro. Si el objeto no es válido, el guardado fallará y se devolverá falso.

Así que si no quiero que se valide el objeto, debería usar update_attribute. ¿Qué pasa si tengo esta actualización en un before_save? ¿Stackoverflow?

Mi pregunta es ¿es update_attribute también eludir antes guardar o solo la validación.

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

+0

¿Por qué quiere poner una declaración 'update_attribute' dentro de una devolución de llamada' before_save'? No puedo pensar en una buena razón para esto. –

+1

Tengo objetos que deben actualizarse según el monto del objeto actualizado. ¿Cuál es la mejor manera? – s84

+0

¿Estoy en lo cierto, que los objetos que necesita actualizar son atributos del objeto que está guardando? En caso afirmativo, entonces puede simplemente configurarlos, y se actualizarán junto con el objeto que se guarda de todos modos (porque están configurados dentro de una devolución de llamada 'before_save'). F.e. en lugar de 'update_attribute (: discount, 0.1) if amount> 100' puedes hacer' discount = 0.1 if amount> 100'. 'update_attribute' llama a' save' en el objeto, lo que no es necesario en este caso, ya que la instrucción está dentro de una devolución de llamada 'before_save' y se guardará de todos modos. Espero que tenga sentido. –

Respuesta

300

Consulte update_attribute. Al hacer clic sobre la fuente espectáculo obtendrá 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 referirse update_attributes y mirar a su código se 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 ambos es update_attribute utiliza save(false) mientras que update_attributes utiliza save o se puede decir save(true).

Disculpe por la descripción larga pero lo que quiero decir es importante. save(perform_validation = true), si perform_validation es falso omite (saltos será la palabra correcta) todos los validations asociados con save.

Por segunda pregunta

Además, ¿cuál es la sintaxis correcta para pasar un hash a update_attributes ... echa un vistazo a mi ejemplo en la parte superior.

Su 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 datos de los campos & nombre en un hash dicen params[:user] ofrecen utilizan simplemente

Object.update_attributes(params[:user]) 
+6

Su afirmación sobre las devoluciones de llamada es incorrecta, al menos en 'Rails 3'. Dice muy claramente en [los comentarios en la fuente] (https://github.com/rails/rails/blob/v3.2.11/activerecord/lib/active_record/persistence.rb#L173) que "se invocan rellamadas". – Batkins

+0

En segundo lugar lo que @Batkins dice – Raf

+2

@Batkins aún no se ejecutan las validaciones: esa es la parte más importante :) – Tigraine

1

Creo que su pregunta es si tener un update_attribute en una before_save dará lugar a un bucle infinito (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 validaciones de disparo mediante el uso de

Model.save falsa

73

Consejo:update_attribute se desaprueba en los carriles 4 a través de Commit a7f4b0a1. Elimina update_attribute a favor de update_column.

+36

Esto ya no es cierto; el método ha sido vuelto a agregar. Consulte https://github.com/rails/rails/pull/6738#issuecomment-39584005 – Dennis

+14

validación de omisiones 'update_attribute', pero respeta las devoluciones de llamada,' update_column' omitirá tanto la validación como las devoluciones de llamada y no actualizará ': updated_at',' update 'es la función normal que respetará tanto las devoluciones de llamada como la validación –

+2

ya se decidirán. reset_column, update_column obsoleta también. – ahnbizcad

11

También digno de mención es que con update_attribute, el atributo deseado que se actualiza no necesita estar lista blanca con attr_accessible para actualizarlo en comparación con el método de asignación de masa update_attributes que sólo se actualizará attr_accessible atributos especificados.

15

update_attribute

Este método de actualización solo atributo de objeto sin invocar validación basada modelo.

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

update_attributes

Este método de actualización de atributo múltiplo de solo objeto y también pasan validación basada 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.

2

update_attribute y update_attributes son similares, pero con una gran diferencia: update_attributeno validaciones de ejecución.

también:

  • update_attribute se utiliza para actualizar el registro con solo atributo.

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

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

Estos dos métodos son muy fáciles de confundir dado sus nombres y obras similares. Por lo tanto, update_attribute se está eliminando a favor de update_column.

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

Click here para obtener más información sobre update_column.

2

Para responder a su pregunta, se salta update_attribute pre Guardar "validaciones" pero todavía funciona cualquier otro devoluciones de llamada como after_save etc. Así que si realmente quiere "simplemente actualizar la columna y saltar cualquier costra AR" entonces necesita utilizar (al parecer)

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

6

grandes respuestas. aviso de que en materia de rubí 1,9 y por encima de usted podría (y creo que debe) utilizar la nueva sintaxis hash para update_attributes:

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

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

Ejemplo:

user = User.last 

#update_attribute 
user.update_attribute(:status, "active") 

pasar la validación

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

no se actualiza si falla la validación.

+0

Muy bien explicado. ¡Gracias! –

2

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

el fin de pasar de hash para update_attribute y validación de derivación que puede hacer:

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

Usted podría estar interesado en visitar esta entrada del blog sobre todas las posibles formas de asignar un atributo o actualización de registro (informado a los carriles 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.

+0

Sí, claro, modifiqué la respuesta. Gracias por la respuesta. – adamliesko