2010-04-26 12 views
10

En ActiveRecord, ¿cómo podemos actualizar un registro sin preocuparnos/saber la clave principal.cómo actualizar un registro sin preocuparse por la clave primaria

Si hago

Address.update(15, :user_name => 'Samuel') 

corresponde a

UPDATE addresses set user_name = 'Samuel' where id = 15 

pero lo que si quiero hacer:

UPDATE addresses set user_name = 'Samuel' where cid = 15 

lo que será el equivalente de ActiveRecord que ??

me trataron:

Address.update({:cid => 15}, :user_name => 'Samuel') 

pero eso no funciona.

Respuesta

14
a = Address.find_by_cid(15) 
a.user_name = 'Samuel' 
a.save 
+9

estás disparando dos consultas ... mal camino ... –

+2

de acuerdo ... tiene que haber una respuesta mejor. – baash05

41

Utilice el método update_all clase:

Address.where(:cid => 15).update_all(user_name : 'Samuel') 

http://apidock.com/rails/ActiveRecord/Relation/update_all

+2

esta debería ser la respuesta. Un golpe en la base de datos y casi cero tráfico de red. Bonito. – baash05

+3

Nota importante: "No instancia los modelos implicados y no desencadena devolución de llamada activa o validaciones. Los valores pasados ​​a' update_all' no pasarán por el comportamiento de conversión de tipo de ActiveRecord. Debería recibir solo valores que se pueden pasar como- es a la base de datos SQL ". – ehannes

7

Para aclarar sobre la respuesta de @ typeoneerror, sólo tiene que utilizar update_all en un objeto ActiveRecord :: Relation en lugar de una objeto de registro:

ModelName.where(:unique_id => x).update_all(:name => "x") 
+0

No es necesario que sea un id. Único. – laffuste

+4

Debería mejorar su respuesta en lugar de crear una nueva –

+0

Esta respuesta se escribió cuando la otra respuesta no tenía un ejemplo, solo el enlace al método. –

Cuestiones relacionadas