让我们假设用户和公司模型之间有一个通用连接表 FollowCompany,例如:
class FollowCompany < ActiveRecord::Base
attr_accessible :user_id, :company_id
belongs_to :user
belongs_to :company
end
它有一个复合主键 [user_id, company_id]。 它没有 id 列,因为 follow_company 记录由 [used_id, company_id] 唯一标识
因为我希望能够将以下关系视为资源,所以我将其设为 RESTful:
路线.rb:
resources :follow_companies
然而,这会导致一个问题:这些生成的路由采用了一个我没有的 :id 键。 我如何告诉 Rails 我实际上使用的是复合键?
我可以想到四种解决方案,我希望得到一些意见,看看哪一种是最好的:
不要将 :follow_companies 设为资源。相反,将 URL 与两个键模式匹配:例如:
match '/follow_companies/:user_id/:company_id/' => follow_companies#edit
然而,这很丑陋,因为它冗长且不符合 REST 风格。覆盖 FollowCompany to_param 方法以包含两个模型 ID,例如
def to_param "#{user_id},#{company_id}" end
然而,这很丑陋,因为它看起来像是一个 hack,并且它有一些令人讨厌的副作用
向 follow_company 表添加一个主键列。 然而,这很丑陋,因为它增加了冗余。 follow_company 记录由 [company_id, user_id] 唯一标识。无需额外的 key 。
下载复合键 gem 并将其与我的开发环境集成。 然而,这很丑陋,因为它不是标准方式,并且与其他 ruby 代码不兼容。
因此,如您所见,我想不出一个优雅的解决方案。 这似乎是一种常见的情况,尽管我不是第一个遇到这种情况的人。几乎每个应用程序都使用(restful)连接表。 处理此问题的最佳做法是什么?
最佳答案
数字 3 的优点是您的 key 将没有意义。虽然不是 super 适用于您的情况,但如果由于某种原因需要更改其中一个键值,则使用复合键会导致该资源的 URL 发生更改。创建无意义的主键意味着即使数据更改后 URL 也将保持不变。
这也往往是执行连接表的“Rails 方式”。
关于ruby-on-rails - 在 rails 中使用复合键连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15579947/