ruby-on-rails - 在 rails 中使用复合键连接表

标签 ruby-on-rails routes composite-primary-key jointable

让我们假设用户和公司模型之间有一个通用连接表 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 我实际上使用的是复合键?

我可以想到四种解决方案,我希望得到一些意见,看看哪一种是最好的:

  1. 不要将 :follow_companies 设为资源。相反,将 URL 与两个键模式匹配:例如:match '/follow_companies/:user_id/:company_id/' => follow_companies#edit 然而,这很丑陋,因为它冗长且不符合 REST 风格。

  2. 覆盖 FollowCompany to_param 方法以包含两个模型 ID,例如

    def to_param
     "#{user_id},#{company_id}"
    end
    

    然而,这很丑陋,因为它看起来像是一个 hack,并且它有一些令人讨厌的副作用

  3. 向 follow_company 表添加一个主键列。 然而,这很丑陋,因为它增加了冗余。 follow_company 记录由 [company_id, user_id] 唯一标识。无需额外的 key 。

  4. 下载复合键 gem 并将其与我的开发环境集成。 然而,这很丑陋,因为它不是标准方式,并且与其他 ruby​​ 代码不兼容。

因此,如您所见,我想不出一个优雅的解决方案。 这似乎是一种常见的情况,尽管我不是第一个遇到这种情况的人。几乎每个应用程序都使用(restful)连接表。 处理此问题的最佳做法是什么?

最佳答案

数字 3 的优点是您的 key 将没有意义。虽然不是 super 适用于您的情况,但如果由于某种原因需要更改其中一个键值,则使用复合键会导致该资源的 URL 发生更改。创建无意义的主键意味着即使数据更改后 URL 也将保持不变。

这也往往是执行连接表的“Rails 方式”。

关于ruby-on-rails - 在 rails 中使用复合键连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15579947/

相关文章:

jquery - 从与显示的不同的文本字段提交值

c++ - 如何在 NS-3 中使用多路径路由

haskell - 使用 Lucid WebUI 导航 Haskell Servant API

JPA/Hibernate 和复合键

ruby-on-rails - 如何使用耐嚼的 gem 使用Elasticsearch滚动API?

ruby-on-rails - Ruby on Rails 的 Windows 和云的替代方案

javascript - Stripe::InvalidRequestError(该客户没有附加付款来源)

javascript - 如何将模型值传递给 ember.js 中的新路由

java - 将复合主键添加到sql结果中

jpa 复合主键,可与唯一键连接