如何在Rails应用程序中设置组合键

时间:2012-06-20 07:17:46

标签: ruby-on-rails

我在我的应用程序中使用'foriegner'gem来设置主键,现在我正处于这样的状态 在表中设置复合主键。

我在网上搜索了这个,但无法为此找到明确的解决方案。

请建议我是否可以使用foreigner gem或任何其他方式在rails应用程序中设置复合键。

注意:我使用的是Postgres

感谢。

2 个答案:

答案 0 :(得分:3)

简短回答:不要在Rails中使用复合PK(除非因为遗留数据库而被迫这样做)。

虽然可能存在可用于(当前)的宝石的解决方案,但这不是ActiveRecord的工作方式。除非有充分的理由,否则我也不会在Rails之外使用复合PK。他们使很多事情变得更加复杂。

但是:没有什么可以阻止你将你认为的复合主键作为替代键,并且使用Rails默认PK(postgres:pseudotype' serial'它从序列中绘制它的值)。只需确保为构成密钥的列添加唯一索引。

答案 1 :(得分:2)

ActiveRecord的

有一个名为composite_primary_keys的宝石,并将这些功能整合到ActiveRecord中。

它支持wide array of ActiveRecord versions

# Gemfile
gem 'composite_primary_keys', '=<version for your AR version>'

像以下示例一样使用它:

class Membership < ActiveRecord::Base
  self.primary_keys = :user_id, :group_id
end

membership = Membership.find([1,1])  # composite ids returns single instance
# => <Membership:0x39218b0 @attributes={"user_id"=>"1", "group_id"=>"1"}>

我很高兴在生产中使用它,保持我的架构干净整洁。

更好的选择:续集

与往常一样,如果您正在寻找一个出色的Ruby + PostgreSQL解决方案,请查看jeremyevans/sequel

它附带了大量功能,包括复合主键。开箱即用。

因此,如果您正在开始一个新项目(显然是在PostgreSQL上),请将自己保存在ActiveRecord的头痛中并与Sequel一起使用。

class Post < Sequel::Model
  set_primary_key [:category, :title]
end