2016-04-19 10 views
0

Ich habe eigentlich eine Tabelle mit Komponenten. Jede Komponente hat eine spezifische Version wie oben beschrieben (es gibt andere Attribute wie Name, Komponententyp-ID, ...):Update-Objekt durch Composite-Key mit Schienen

id | version_id

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

167 | 1

167 | 96

167 | 97

167 | 98

167 | 99

166 | 1

166 | 92

Die Attribute "id" und "version_id" sind ein zusammengesetzter Primärschlüssel, und ich möchte ein Objekt bearbeiten, indem ich diese zusammengesetzte PK identifiziere.

Wenn ich will, die Version 99 der Komponente # 167 = aktualisieren>

Mit Schienen, wenn ich tun:

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

Rails tun:

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"]] 

Aber ich möchte etwas in der Art:

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"]] 

Danke, mir zu helfen Prost

Antwort

0

Da diese nur einen Datensatz mit der angegebenen ID und die Version ist, versuchen Sie:

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

Auf diese Weise Rails wird ein Datensatz nicht Instanz, Ihr Problem zu vermeiden.

+0

Danke, ich war so nah :) – user3293526

+0

Ich hatte ein anderes Problem, ich löse es. Ich dachte, dass ich die gleiche Sache genau das tun, könnte zu zerstören, so ich getan: Component.where (id: 167, version_id: 99) .destroy_all Aber die richtig war ===== >> Komponente. where (id: id: 167, version_id: 99) .delete_all – user3293526

+0

destroy_all erstellt Datensatzinstanzen und ruft die Methode destroy für sie auf, und eine Instanz hat keine Kenntnis darüber, wie sie abgerufen wurde (der version_id-Teil), sie kümmert sich nur um die ID . Der Punkt ist nicht instanziiert Rekord. –