【问题标题】:How do Rails migrations enforce relationships?Rails 迁移如何强制关系?
【发布时间】:2010-10-06 06:04:04
【问题描述】:

当你运行时:

rake db:migrate

唯一正在处理的文件是 db/migrate/ 中的文件,对吗?

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

【问题讨论】:

    标签: ruby-on-rails database-design web-applications migration


    【解决方案1】:

    很简单,它没有。

    这是由于必须支持多个数据库。有些,例如 sqlite,不支持外键。

    要添加外键,您必须为它们执行原始 SQL。

    【讨论】:

    • 那么声明has_many、belongs_to等有什么意义呢?
    • 在您的对象之间建立正确的关联。如果唯一改变您的数据库的是 rails 应用程序,那么应用程序本身应该在没有数据库帮助的情况下尊重这些关系。
    • 我明白了。我猜这些约束是在更高的应用层而不是底层数据库上执行的。希望一些文字提到它,我已经对此感到困惑一段时间了。
    • 这比仅仅支持多个数据库更糟糕 - 根据您在 MySQL 中选择的引擎,它可能支持或不支持外键。
    • Rails 跟踪外键,而不是数据库。在模型中贴花has_many 告诉 Rails 这些外键在哪里以及它们的名称是什么。数据库只知道一个表有一个名为comment_id 的字段,类型为:整数。
    【解决方案2】:

    正如其他人所说,Rails 并没有真正使用 SQL 关系,而是仅在代码中模仿它。它实际上并没有强制执行引用完整性,但看起来确实如此。

    有一个小流派认为,出于这个原因,您应该使用迁移,而是使用原始 DDL 创建和保护您的数据库,因为 Rails 哲学存在缺陷,它仍然会留下您的数据模型完全开放,同时提供一些安全措施(我喜欢用激光保护的开放式保险箱)。显然,您失去了迁移的好处(我想您也可以保留迁移并手动添加执行语句)。请参阅 Dan Chak 所著的Enterprise Rails一书;他有几章讨论这个问题并展示了他的想法。

    【讨论】:

      【解决方案3】:

      Garry 是对的,约束是由应用程序本身强制执行的。 不过,如果您真的希望设置外键,foreign_key_migrations 插件可以很好地为您服务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-04
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 2012-01-15
        • 1970-01-01
        • 2015-03-01
        相关资源
        最近更新 更多