2010-04-26 2 views
10

Dans ActiveRecord, comment pouvons-nous mettre à jour un enregistrement sans se soucier de la clé primaire?comment mettre à jour un enregistrement sans se soucier de la clé primaire

Si je

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

correspond à

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

mais si je veux faire:

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

ce qui sera l'équivalent ActiveRecord de cette ??

J'ai essayé:

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

mais cela ne fonctionne pas.

Répondre

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

vous lancez deux requêtes ... mauvaise façon .. –

+2

convenu .. il doit y avoir une meilleure réponse. – baash05

41

Utilisez la méthode de classe update_all:

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

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

+2

cela devrait être la réponse. Un coup à la base de données, et le trafic réseau presque nul. Agréable. – baash05

+3

Remarque importante: "Il n'instancie pas les modèles concernés et ne déclenche pas de rappels ou de validations Active Record Les valeurs passées à" update_all "ne passeront pas par le comportement de cast de type ActiveRecord. est à la base de données SQL. " – ehannes

7

Pour clarifier sur la réponse de @ typeoneerror, il suffit d'utiliser update_all sur un objet ActiveRecord :: Relation plutôt qu'un objet d'enregistrement:

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

Pas besoin d'être un identifiant unique tho. – laffuste

+4

Vous devriez améliorer sa réponse au lieu de créer un nouveau –

+0

Cette réponse a été écrite lorsque l'autre réponse n'avait pas d'exemple, seul le lien vers la méthode. –

Questions connexes