为嵌套路由创建相对ID

时间:2014-05-08 16:01:02

标签: ruby-on-rails nested-routes

我正在尝试为Rails中的嵌套路由创建本质上是第二个id列。

我的路线看起来像这样:/projects/:project_id/bugs/:bug_id

项目有一个has_many :bugs关系和一个错误belongs_to :project。现在,路径中显示的bug_id是模型保存到数据库时生成的标准增量ID。

但是,我更希望它与项目相关。

换句话说,我想在bug模型上创建一个名为relative_id的列,该列从每个项目中的1开始并自动递增。

示例:

/projects/1/bugs/1 #should take me to the first bug of project one
/projects/2/bugs/1 #should take me to the first bug of project two

我的问题是,我是否必须手动维护此relative_id列,或者是否有一些我可以利用的Rails'魔术'来使这更容易?

routes.rb中:

resources :projects do
    get 'bugs/feed' => 'bugs#feed'
    get 'bugs/groups' => 'bugs#groups'
    resources :bugs
    resources :permissions, :only => ['create']
end

1 个答案:

答案 0 :(得分:2)

我会建议不要这样做,因为它只会让你的生活变得更加困难。例如,您始终 总是必须执行Bug.find(2)Bug.where(project_id: 5, relative_id: 2),而不是Project.find(5).bugs.where(relative_id: 2)。这可能看起来不是什么大不了的事情,但它会比你想象的更频繁地妨碍你。

如果您使用bugs的常规“全局”AUTO_INCREMENT ID,您仍然可以拥有像/projects/5/bugs/2这样的漂亮网址(无论如何,如果只有有权访问项目X的人应该是能够访问它的错误)。对于您的用户来说,新项目的错误ID始终从1开始是否很重要?

如果您确定需要这样做,我很确定您需要自己实施。出于一致性原因,可能在数据库级别(而不是在Rails中)执行它是最好的。您需要这样做才能获得之前的MAX(relative_id)并创建新记录,以便在此期间不会创建其他记录(或者您最终会得到relative_id碰撞)。以下是一个可能对您有所帮助的相关问题:MySQL second auto increment field based on foreign key

我知道这不是您正在寻找的答案,但我希望它有所帮助。