Rails迁移如何强制执行关系?

3
当您运行以下命令时:
rake db:migrate

只有db/migrate/目录中的文件正在被处理,是吗?

既然在app/models/中定义了一对一、一对多和多对多等关系,那么Rails如何强制执行这些关系呢?当我进行迁移并查看生成的数据库模式时,我看不到任何外键约束。所以这让我感到困惑,不知道所有这些是如何工作的。

3个回答

6

简单来说,它无法实现。

这是因为需要支持多个数据库。有些数据库,比如sqlite,不支持外键。

要添加外键,您需要执行原始SQL。


1
声明 has_many、belongs_to 等的目的是什么呢? - alamodey
为了让你的对象之间有正确的关联,如果只有Rails应用程序在更改你的数据库,那么该应用程序本身就应该尊重这些关联,而不需要依赖于数据库的协助。 - Garry Shutler
我明白了。我猜这些限制是在更高的应用层强制执行,而不是在底层数据库上。希望有些文本能提到这一点,我已经为此感到困惑了一段时间。 - alamodey
这比仅仅支持多个数据库更糟糕 - 根据您在MySQL内选择的引擎,它可能支持外键,也可能不支持。 - Lolindrath
Rails 跟踪外键,而不是数据库。在模型中声明 has_many 告诉 Rails 这些外键在哪里以及它们的名称是什么。数据库只知道一个表有一个名为 comment_id 的字段,类型为整数。 - Alex Wayne

2
正如其他人所说,Rails实际上并不使用SQL关系,但仅在代码中模拟它。它并没有强制执行引用完整性,但使其看起来像是这样做了。
有一小部分人认为,出于这个原因,你不应该使用迁移,而是使用原始的DDL创建和保护你的数据库,因为Rails的哲学是有缺陷的,它仍然让你的数据模型处于开放状态,同时提供了一些安全措施(我喜欢用激光保护的开放式保险箱来形容)。显然,你会失去迁移的好处(我想你可以保留迁移并手动添加execute语句)。请参阅Dan Chak的书《Enterprise Rails》,他有几章讨论了这个问题并展示了他的想法。

1

Garry说得对,应用程序本身强制执行约束条件。 如果您真的希望设置外键,则 foreign_key_migrations 插件可能会对您有所帮助。


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