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

8

我现在开始学习Rails,我在论坛上查找了一下,但没有找到能解决我的问题的内容。

我的问题是:我有一个Category表,只有一个名为name的列(类别中没有重复项),所以我想把name设为主键;然后我有一个Product表,包含name、main_photo和description字段,并且我希望每个产品都只属于一个类别,请问我需要在product表中添加一个名为category的外键列吗?

一个Category应该有多个产品。

那么,在category模型中,我如何表示name是主键,并且如何对应categories中的主键name和products中的category?

2个回答

15

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

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

然后,在您的模型中,定义实体Product和Category之间的关系。阅读文章《Active Record关联指南》,它将回答您所有的问题,特别是第2.1、2.2和3.3节。


但是当我执行 rails generate scaffold Category name:string 命令时,默认会创建一个 id 列吗?我的表格将会有一个 id 和一个 name 列。 - Márcio Duarte
1
是的,它应该向每个表添加一个ID列。但它不会自动向产品表添加Category_ID列,您需要手动添加。 - dnatoli
1
请阅读我在答案中发布的链接,你所有问题的答案都在那里。 - dnatoli
5
如果你在生成数据库迁移时使用category:references作为参数,或者在迁移中添加t.references :category,它会自动添加一个category_id字段。 - Sean Hill
但是它说要在迁移中创建相应的id列。这样表格就不再是愚蠢的了,它们通过外键链接起来。我是否误解了“愚蠢表格”的定义?也许唯一愚蠢的是我自己。哈哈 - ahnbizcad
1
我的意思是“愚蠢的存储”,指的是数据库中没有引用完整性或业务逻辑(即约束)。但是,这并不意味着您不应该稍后添加它们。它们无法在Active Record中完成的原因是它旨在与数据库无关,并且在某些数据库中无法添加外键。因此,如果可以添加它们,您应该这样做。 - dnatoli

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接