1

假设我需要嵌套在 routes.rb 中的两个资源,如下所示:

resources :post do
  resources :comment
end

按照惯例, comments.id将是评论主键comments.post_id将是外键

我需要主键复合键 [comments.post_id, comments.id]

这样我就可以对每个具有 id == 1 的不同帖子的第一条评论,对每个具有 id == 2 的不同帖子的第二条评论等等......

当然,我还需要禁用所有引用评论(子资源)的路由,而不是引用它的帖子(父资源)。

这只是一个例子,我的实际项目与博客无关(我对这个问题的处理方式不同),我想知道是否有办法为嵌套资源实现这种行为以实现兼容性使用遗留数据库。

谢谢你。

4

3 回答 3

3

一种方法是创建另一列(将 posts.id 保留为主键),在该列上添加唯一性验证,范围为 post id,然后在 _create hood 之前或之后编写一些以生成该列值.

一个例子(不是真正的代码)

class Comment < ActiveRecord::Base
  ...
  validates_uniqueness_of :sub_id, :scope => :post_id

  before_create do
    this.sub_id = post.comments.size + 1
  end
end

因此 sub_id 列充当主键。当您查询某个帖子的评论时,您可以执行以下操作:

post.comments.where(:sub_id => val).first

或者

post.comments.find_by_sub_id(val)

请注意,此处的真实逻辑应进行调整以满足您的要求。例如,如果可以删除评论,最好在帖子上保留一个计数器,用于确定下一个 sub_id(或编写一个子 id 生成器类)。

于 2011-12-11T14:35:31.820 回答
1

实际上,我不太确定您要完成什么,为什么?也许你冷得更清楚一点。无论如何,两个链接可能会有所帮助:

Rails 中的复合主键

铁路协会

所以,如果可以的话,我会使用上面第二个链接中解释的第三个模型来实现它。如果那是不可能的,您可能想尝试第一个链接中提到的 gem。

于 2011-12-11T13:36:12.110 回答
0

只是一个旁注:可能是合乎逻辑的

before_create do this.sub_id = post.comments.size + 1 end

应通过适当处理删除评论来备份。否则我们很快就会遇到重复的 sub_ids。

于 2013-05-15T13:02:40.200 回答