在 Rails 上创建表时需要创建外键吗?

Posted

技术标签:

【中文标题】在 Rails 上创建表时需要创建外键吗?【英文标题】:Need to create a foreign key when creating a table on Rails? 【发布时间】:2012-01-10 04:47:58 【问题描述】:

我现在开始使用 Rails,我查看了论坛,但我没有找到任何可以解决我的问题的东西。

在这里,我有一个 Category 表,它只有一个列的名称(类别中没有重复)所以我希望 name 作为主键,然后我有一个 Product 表,它有 name, main_photo,description,我想说一个产品只有一个类别,我是否需要在产品中添加一个名为 category 的列作为外键?

一个类别应该有很多产品。

那么在category模型中怎么说name是primary Key,在category中假定的主键名称和products中的category如何对应呢?

【问题讨论】:

【参考方案1】:

Active Record 中的外键约束并不经常使用,因为 Active Record 背后的思想认为这种逻辑应该属于模型而不是数据库 - 数据库只是一个愚蠢的存储:http://guides.rubyonrails.org/migrations.html#active-record-and-referential-integrity。

Rails 方法是在所有表(包括 Categories 表)上都有一个 ID 列,在 Products 表中,有一个名为 Category_ID 的列。请注意,表名是复数。

然后在您的模型中定义实体产品和类别之间的关系。阅读文章A Guide to Active Record Associations,它将回答您的所有问题,尤其是第 2.1、2.2 和 3.3 节。

【讨论】:

但是当我在rails生成脚手架Category name:string时,它不会默认创建一个id列吗?然后我的表将有一个 id 和一个 name 列.. 是的,它应该为每个表添加一个 ID 列。但它不会将 Category_ID 列添加到 Products 表中,您必须手动执行此操作。 阅读我在回答中发布的链接,您的问题的所有答案都在那里。 如果您使用 category:references 作为参数生成迁移,它可以自动添加 category_id,或者只是将 t.references :category 添加到迁移中。 我的意思是哑存储,因为数据库中没有参照完整性或业务逻辑(即约束)。但是,这并不意味着您以后不应该添加这些。它们不能在活动记录中完成的原因是它与数据库无关,并且在某些数据库中您不能添加外键。因此,如果您可以添加它们,那么您应该添加它们。【参考方案2】:

在数据库中有外键有很多正当理由。见Does Rails need database-level constraints?

如果您想轻松地将外键添加到您的 Rails 应用程序,我推荐 Foreigner。

【讨论】:

以上是关于在 Rails 上创建表时需要创建外键吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在尝试创建此表时不断收到外键错误? [复制]

Oracle一个字段的的外键可以当另一个字段的主键吗

Django:在运行单元测试之前创建测试表时“无法添加外键约束”

我需要在 Oracle 的外键上创建索引吗?

Rails:引用一个表时创建两个导航属性

如何在sqlyog设置表的外键