为什么rails中的“ has_one”需要外键?

时间:2018-08-06 05:55:51

标签: ruby-on-rails ruby-on-rails-4 activerecord

考虑两个表FooBar并考虑基于它们的模型。现在考虑一下它们之间的一对一关系。

Foo的声明中包含has_one :bar,以便我们能够从Bar的对象访问Foo。但是我不明白的是为什么Bar需要引用Foo的外键?

如果他们只比较两个id来获得结果,这会更容易吗?

我假设比较两个id会出现问题,我想知道问题所在。

2 个答案:

答案 0 :(得分:0)

您不能假定数据库引擎会将相同的ID添加到不同表中的行。您可以(我不建议)制作具有这种行为的应用程序,并使用触发器和约束来实现它,但这对于关系数据库来说是一种非常有创意(在负面意义上)的方法。

答案 1 :(得分:0)

id的问题是它们存储自动递增的值。让我们考虑2个表studentsprojects。 假设一个学生最多可以有一个项目。这意味着他可以有一个项目,也可以没有。

现在考虑2个学生A和B。

students table

id name
1   A
2   B

现在projects table

id name
1  P1
2  NULL

在这种情况下,A有一个名为P1的项目,但B没有,我们创建一个空条目只是为了维护和匹配项目中与学生的记录ID,但从长远来看这是不可行的。如果在一所学校有1000名学生,那么对于不参与项目的500名学生,我们将有500个空行。

这就是为什么在projects table中添加一列是减小表的大小并维护关系的可行解决方案的原因,并且如果您要删除一条记录,那么新的ID将不会相同因为前一个ID是自动递增的。

现在projects table

id name student_id
1  P1    1

更加可行和灵活。您也可以设置has_many,因为一个学生也可以从事多个项目。

希望对您有帮助。