我在我的应用程序中使用'foriegner' gem 来设置主键,现在我可以在表中设置复合主键。
我在网上搜索了这个,但无法找到一个明确的解决方案。
如果可以使用外国人 gem 或任何其他方式在 Rails 应用程序中设置复合键,请建议我。
注意:我正在使用 Postgres
谢谢。
我在我的应用程序中使用'foriegner' gem 来设置主键,现在我可以在表中设置复合主键。
我在网上搜索了这个,但无法找到一个明确的解决方案。
如果可以使用外国人 gem 或任何其他方式在 Rails 应用程序中设置复合键,请建议我。
注意:我正在使用 Postgres
谢谢。
ActiveRecord有一个名为composite_primary_keys
并集成了这些功能的 gem。
# 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
简短的回答:不要在 Rails 中使用复合 PK(除非您因为遗留数据库而被迫这样做)。
虽然(目前)可能有可用的 gem 解决方案,但这并不是 ActiveRecord 的工作方式。除非有充分的理由,否则我也不会在 Rails 之外使用复合 PK。它们使很多事情变得更加复杂。
但是:没有什么能阻止您将您认为的复合主键作为替代键并拥有 Rails 默认 PK(postgres:伪类型'serial',它从序列中提取其值)。只需确保为构成您的键的那些列添加唯一索引。