暂时解决:
似乎 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?如果我这样做了会有什么副作用么?有没有更好的解决方案呢?
求帮助,谢谢。