我在我的应用程序中使用'foriegner'gem来设置主键,现在我正处于这样的状态 在表中设置复合主键。
我在网上搜索了这个,但无法为此找到明确的解决方案。
请建议我是否可以使用foreigner gem或任何其他方式在rails应用程序中设置复合键。
注意:我使用的是Postgres
感谢。
答案 0 :(得分:3)
简短回答:不要在Rails中使用复合PK(除非因为遗留数据库而被迫这样做)。
虽然可能存在可用于(当前)的宝石的解决方案,但这不是ActiveRecord的工作方式。除非有充分的理由,否则我也不会在Rails之外使用复合PK。他们使很多事情变得更加复杂。
但是:没有什么可以阻止你将你认为的复合主键作为替代键,并且使用Rails默认PK(postgres:pseudotype' serial'它从序列中绘制它的值)。只需确保为构成密钥的列添加唯一索引。
答案 1 :(得分:2)
有一个名为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