编辑:
从 Rails 的角度来看,我希望一个列是主键和外键。也就是说使用 references
方法的外键。我想做类似的事情:
def change
create_table :VipPerson, id: false do |t|
t.primary_key :person_id
t.references :person, :id, column: :person_id
t.timestamps
end
end
我想要一个自定义主键,Rails 模型也使用它来指向 Person 模型(见下文)。这实际上与 sql 数据库使用的外键无关(正如 Demi Magus 所指出的,Rails 直到 Rails 4.2 才支持创建真正的外键)。
-
我想在我的 Rails 项目中实现多表交互 (MTI),从而像通常在关系数据库中那样实现继承:
table: Person
-------------
(PK) ID
Name
...
table: VipPerson (specalization of Person)
----------------
(PK) (FK) Person_ID
VIP-Status
...
为此,我需要编写一个迁移,将属性(此处为 Person_ID
)同时声明为(自定义)主键和外键。我没有看到如何使用 Rails 的迁移 DSP 的方法来做到这一点。
我不想使用 Rails 的多态关联,因为我想保证数据库中的数据完整性。我知道我还需要自定义 Rails 模型,但我们先不谈这个话题。主要问题是如何编写使 PK 也成为 FK(反之亦然)的迁移。
最佳答案
外键关系仅适用于最新版本的 rails,如您在 release notes 中所见,为 4.2。 ,你可以像这样使用它
创建一个简单的外键
add_foreign_key :articles, :authors
生成:
ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id")
您还应该知道 add_foreign_key 只会生成一个外键约束,而不是像 activerecord add_column 那样生成一个列
add_column :articles, :author_id, :integer
将生成:
ALTER TABLE "articles" ADD COLUMN author_id INT(11);
您可以找到更多信息 here
此外,如果您不只是在寻找 rails 的边缘,那么您会发现这个有用的 gem 可以让您做您正在寻找的事情,它是 composite_primary_keys ,唯一需要注意的是,您必须使用与您的 Rails 版本兼容的版本。
希望对你有帮助:D
关于sql - 使外键也成为 Rails 迁移中的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27883934/