我正在尝试为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
答案 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
我知道这不是您正在寻找的答案,但我希望它有所帮助。