暂时解决:
似乎 2, 3, 4 是多余的,但是 Rails 的 convention 实在太强,如果主键不叫 id,会造成极大的不便,还是一次改对比较好。
现在还有一个问题就是 primary key 不会 auto increment . 完全不知道原因,也许是先指定后更名造成的后果,当前在 controller 中手动指定 id 加一,暂时先用着。
好吧... 接手了一个老 Rails 项目,原来的作者是个开发 IDE 的牛人,不过他从没搞过 Rails,当初也是现学现写的,一个测试都没有我就先不说了,现在碰上一个坑是这样的:
有一个 model 叫 Resource
( 嗯,你猜对了,routes.rb
里面有一行 resources :resources
,不过这不是重点 )
另有一个 model 叫 ResourceRevision
是用来给 Resource
做版本控制的,就是说 Resource
的 #show
实际上显示的是某一个 ResourceRevision
的内容,每修改一次,会存成一个新的 ResourceRevision
。
然而, ResourceRevision
对应的数据表 resource_revisions
里面没有 primary key ......
resource_revisions
这个表里面有一个 id
字段和一个 resource_id
字段,resource_id
对应的是这个 ResourceRevision
从属的 Resource
的 id
,这个正常;但是 id
字段仅在一个 Resource
内部递增,下一个 Resource
又从 1 开始。不知道我说清了没有,举例子:
@revision_1 = ResourceRevision.where(resource_id: 1, id: 1) # 第 1 个 Resource 的第 1 个 ResourceRevision
@revision_2 = ResourceRevision.where(resource_id: 1, id: 2) # 第 1 个 Resource 的第 2 个 ResourceRevision
@revision_3 = ResourceRevision.where(resource_id: 2, id: 1) # 第 2 个 Resource 的第 1 个 ResourceRevision
这三个都是可以的,也就是没有一个 column 是 unique 的。
虽然已经把这两个 key 合做了 index,但是还是有些麻烦,比方说我经常会得到这种错误:ActiveRecord::UnknownPrimaryKey in ResourceRevisionsController#some_method
我也试过 composite_primary_keys 这个 gem,但是用了之后原来所有的取值都无效了,Rails 会把两个 id 合成一个数组当 id
去数据库里面取值,显然取不到,这个 gem 应该只适合特别设计的表结构。
那么现在我该怎么办呢?我在想能不能就另加一个 column,起名 unique_id
之类的,设成 primary key?如果我这样做了会有什么副作用么?有没有更好的解决方案呢?
求帮助,谢谢。