【问题标题】:Support for foreign key constraint in Rails在 Rails 中支持外键约束
【发布时间】:2008-11-26 10:00:48
【问题描述】:

在Ruby on Rails中,迁移时如何添加外键约束?

【问题讨论】:

    标签: mysql ruby-on-rails foreign-keys


    【解决方案1】:

    这是一个基于 gem 的解决方案,包括对添加和删除外键约束的支持,在 sqlite 上不会失败,并且可以在 schema.rb 文件中正常工作:

    http://github.com/matthuhiggins/foreigner

    【讨论】:

    • 仅供参考,foreigner 在使用 SQLite 时不会在 schema.rb 中生成外键,因为 SQLite 不支持外键。
    【解决方案2】:

    这是 matthuhiggins-foreigner gem 的更新:http://github.com/sparkfly/foreigner

    特点:

    • rspec 覆盖率,针对 PostgreSQL 8.3.9 和 MySQL 5.0.90 进行测试
    • 迁移支持
    • schema.rb 支持

    未来版本将包含 PostgreSQL 的 CHECK 约束,这是实现多表继承所必需的。

    【讨论】:

    • 谢谢。外国人 gem 不能很好地使用 change 方法,特别是如果之前没有创建过表。这很好用
    • 欢迎您。如果您发现任何错误,请告诉我(通过 github)。
    【解决方案3】:

    AFAIK,没有任何内置支持,但有 several plugins 可以帮助您。您也可以手动将它们添加到迁移文件中,只需使用执行方法即可,例如(来自 Rails API 的示例):

      class MakeJoinUnique < ActiveRecord::Migration
        def self.up
          execute "ALTER TABLE `pages_linked_pages` ADD UNIQUE `page_id_linked_page_id` (`page_id`,`linked_page_id`)"
        end
    
        def self.down
          execute "ALTER TABLE `pages_linked_pages` DROP INDEX `page_id_linked_page_id`"
        end
      end
    

    【讨论】:

    • 旧帖,但万一有人看到:唯一索引不等同于外键约束,所以我相信这段代码不能回答 OP 的问题。
    【解决方案4】:

    添加以下内容是否足够,例如 ProductsUser 模型?

    add_index :products, :user_id

    【讨论】:

    • 添加索引肯定会提高查​​询性能,但不会使数据库强制执行外键约束。
    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多