2010-12-15 136 views
14

Supposons que j'ai une table appelée 'user_products' et un modèle correspondant appelé UserProduct dans mon application Rails. J'ai aussi un champ appelé 'is_temporary' dans ma table. Supposons maintenant que je veux exécuter une requête comme celui-ci, mais en utilisant la couche d'abstraction ActiveRecord:Mettre à jour plusieurs enregistrements simultanément avec ActiveRecord dans Rails en utilisant une requête?

UPDATE user_products SET is_temporary = false WHERE user_id = 12345; 

Est-il possible que je peux le faire en utilisant ActiveRecord? Peut-être quelque chose dans le sens de

UserProduct.find_by_user_id(12345).update_attributes(:is_temporary => false) 

Je voudrais qu'une seule requête soit exécutée pour que cela se produise.

Répondre

16
UserProduct.update_all({:is_temporary => false}, {:user_id => 12345}) 
18
UserProduct.update_all({:is_temporary => false}, {:user_id => 12345}) 

Bien Attention: ce saute tous les validations et callbacks, puisque aucun cas de UserProduct ne sera jamais instancié.

19

Ceci est un ancien message. Je mis à jour ce au cas où quelqu'un le vérifie :) (Rails 4)

DEPRECATION: Relation#update_all with conditions is deprecated. Please use Item.where(color: 'red').update_all(...) rather than Item.update_all(..., color: 'red'). 

Ainsi, la requête sera

UserProduct.where(:user_id => 12345).update_all(:is_temporary => false) 

Vive

+1

beaucoup apprécié, merci! – Sebastialonso

+0

Cela semble également fonctionner dans Rails 3 – lavaturtle