使用rails更新由复合键标识的对象

时间:2016-04-19 08:13:02

标签: ruby-on-rails key edit composite

我实际上有一个包含组件的表。每个组件都有一个特定的版本,如上所述(还有其他属性,如name,component_type_id,...):

id | version_id

 

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

 

167 | 1

 

167 | 96

 

167 | 97

 

167 | 98

 

167 | 99

 

166 | 1

 

166 | 92

属性“id”和“version_id”是复合主键,我想通过识别此复合PK来编辑对象。

如果我想更新组件#167 =>

的版本99

当我这样做时使用rails:

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

Rails这样做:

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

但我想要这样的东西:

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

感谢帮助我 干杯

1 个答案:

答案 0 :(得分:1)

由于这些只是具有给定ID和版本的一条记录,请尝试:

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

通过这种方式,Rails不会实例化记录,避免出现问题。