2016-04-19 1 views
0

J'ai actuellement une table avec des composants. Chaque composant a une version spécifique comme décrit ci-dessus (il existe d'autres attributs tels que name, component_type_id, ...):Mettre à jour l'objet identifié par une clé composite avec des rails

id | version_id

----- + ------------

167 | 1

167 | 96

167 | 97

167 | 98

167 | 99

166 | 1

166 | 92

Les attributs "id" et "version_id" sont une clé primaire composite, et je souhaite éditer un objet en identifiant ce PK composite.

Si je veux mettre à jour la version 99 du composant # 167 =>

Avec rails quand je fais:

Component.where(id: 167, version_id: 99).first.update({"component_type_id"=>"5", "name"=>"CCC"}) 

Rails faire:

SELECT "components".* FROM "components" WHERE "components"."id" = $1 AND "components"."version_id" = $2 ORDER BY "components"."id" ASC LIMIT 1 [["id", 167], ["version_id", 99]] 

UPDATE "components" SET "name" = $1, "updated_at" = $2 WHERE "components"."id" = 167 [["name", "CCC"], ["updated_at", "2016-04-19 08:05:09.049345"]] 

Mais je vouloir quelque chose comme ça:

UPDATE "components" SET "name" = $1, "updated_at" = $2 WHERE "components"."id" = 167 AND version_id = 99 [["name", "CCC"], ["updated_at", "2016-04-19 08:05:09.049345"]] 

Merci de me aider Vive

Répondre

0

Puisque c'est un seul enregistrement avec l'ID donné et la version, Essayez:

Component.where(id: 167, version_id: 99).update_all(component_type_id: 5, name: "CCC") 

De cette façon, Rails ne sera pas exemple un enregistrement, éviter que votre problème.

+0

Merci, j'étais si proche :) – user3293526

+0

J'ai eu un autre problème, je le résous. Je pensais que je pouvais faire exactement la même chose pour les détruire si je fait: Component.where (id: 167, VERSION_ID: 99) .destroy_all Mais le bon était ===== >> Component. où (id: id: 167, version_id: 99) .delete_all – user3293526

+0

destroy_all crée des instances d'enregistrement et appelle la méthode destroy sur eux, et une instance n'a aucune connaissance sur la façon dont elle a été récupérée (la partie version_id), elle se soucie juste de l'id . Le point est de ne pas obtenir d'enregistrement instancié. –