174 votos

Rieles: update_attribute vs update_attributes

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

Ambos de estos va a actualizar un objeto sin tener que decirle explícitamente AR para actualizar.

Los rieles de la API dice:

para update_attribute

Actualizaciones de un solo atributo y guarda el registro sin necesidad de pasar por el normal procedimiento de validación. Esto es especialmente útil para booleano banderas en los registros existentes. La regular update_attribute método en Base está sustituido con esto cuando las validaciones módulo en el que se mezcla, que es por defecto.

para update_attributes

Las actualizaciones de todos los atributos de la pasada Hash y guarda el registro. Si el objeto no es válido, el ahorro se producirá un error y se devolverá false.

Así que si yo no quiero tener el objeto validado que debo usar update_attribute. Lo que si tengo esta actualización en un before_save, stackoverflow?

Mi pregunta es ¿update_attribute también omitir el antes de guardar o simplemente la validación.

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

232voto

Salil Puntos 20300

Hey por favor consulte update_attribute. Al hacer clic en mostrar fuente obtendrá código siguiente

      # 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 se refieren update_attributes y un vistazo a su código de obtener

      # 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 los dos es update_attribute utiliza save(false) mientras que update_attributes utiliza save o usted puede decir save(true).

Lo siento por el largo de la descripción, pero lo que quiero decir es importante. save(perform_validation = true), si perform_validation es falso que omite (salta será la palabra correcta) todas las validaciones assosciated con save.

Para la segunda pregunta

También, ¿cuál es la sintaxis correcta para pasar un hash para 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 usted obtiene todos los campos de datos y el nombre del hash decir params[:user] aquí el uso de sólo

Object.update_attributes(params[:user])

70voto

Matt Puntos 639

Tip: update_attribute es ser obsoleto en 4 carriles por cometer a7f4b0a1. Quita update_attribute a favor de update_column .

11voto

update_attribute

Este atributo único método update del objeto sin invocar modelo basado en la validación.

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

update_attributes

Este método actualizar múltiples atributos de objeto único y también pasar la validación del modelo base.

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

Espero que esta respuesta se borrará cuando se utiliza qué método de registro activo.

10voto

Kibet Yegon Puntos 921

También cabe destacar que con el update_attribute , el atributo deseado ser actualizados no necesita ser blanco con attr_accessible para actualizarlo en comparación con el método de asignación masiva update_attributes que sólo se actualizará attr_accessible especifica atributos.

1voto

rogerdpack Puntos 12806

Para responder a tu pregunta, update_attribute salta pre salvar "validaciones" pero todavía funciona como cualquier otros callbacks after_save etc.. Así que si quieres "sólo actualiza la columna y omitir cualquier cruft AR" Entonces necesitas usar (al parecer)

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: