【问题标题】:Why would someone use the gem foreigner?为什么有人会使用 gem 外国人?
【发布时间】:2013-02-05 21:54:46
【问题描述】:

这很可能是一个菜鸟问题,因为人们使用这个宝石并且很多人喜欢它,但我不明白目的。我正在查看一个项目,它在t.references :foreign_key_table_name , :foreign_key => trueadd_foreign_key :table :foreign_key_table_name, :options 和创建t.foreign_key :foreign_key_table_name 等地方多次使用。希望那些没有混淆,因为它们脱离了上下文。

但我不明白这与 rails 内置的 t.references :foreign_key_table_name 或我只是添加 t.integer :foreign_key_table_name_id 有何不同?它是否只是通过明确这是一个“外键”来使其更具可读性?如果是这种情况,我可以添加评论而不是 gem...我看到的唯一优势是您可以将诸如 :dependent 之类的选项移动到迁移中,而不是将其放在模型中,但谁在乎呢?

【问题讨论】:

    标签: ruby-on-rails gem foreign-keys foreigner


    【解决方案1】:

    一些数据库引擎支持合法的外键约束:如果有人试图用 5 的 parent_id 保存 Child,但没有 Parentid 5,那么数据库本身(不是 Rails)将如果存在链接children.parent_idparents.id 的外键约束,则拒绝记录。

    外键还可以指定删除父项时会发生什么:例如,在 MySQL 中,我们可以删除或使依赖记录无效,就像 Rails 对 :dependent 所做的那样,甚至直接拒绝删除而是抛出一个错误。

    由于并非所有数据库引擎都提供此功能,Rails 提供了使用:dependent 来模拟它,并且在软件级别拥有它非常好,这样依赖的子记录可以在删除父记录时触发它们的destroy 回调。由于该功能独立于引擎,因此几乎独立于模式,Rails 不处理外键的创建/删除。这就是 foreigner 的用武之地:如果您的引擎支持外键约束,并且您希望对自己的数据完整性更加自信,foreigner 可以提供帮助。

    【讨论】:

    • @GiH:哦,我现在才想到为什么:dependent 不这样做:因为它是模型级别的规范,可以随时添加/删除。它被构建为灵活的,而不是要求外键也存在于数据库中——这会非常奇怪,因为并非所有 Rails 支持的数据库引擎也支持外键。
    【解决方案2】:

    在这里复活一个老问题,但是……

    在 rails 本身内,让 rails 强制执行关系很好。

    但是,如果您的项目发展到拥有还可以从其他语言访问这些表的代码,则不会有 Rails 强制执行关系的好处。这些外键约束被嵌入到 SQL 表本身中,因此可以保护非 Rails 代码。

    如果您需要执行数据修复或以其他方式通过本机 SQL 操作数据,这也将保护您。

    【讨论】:

      【解决方案3】:

      另一个原因是一些用于 SQL 的文档工具会查看数据库上的外键,因此拥有一个生成它们的 gem 是很酷的。 Rails 4 添加了在创建表的同一迁移中定义外键的能力:

      t.references :something, foreign_key: true
      

      如果您使用 references 类型,生成器将为您执行此操作。当像这样使用foreign_key 时,Rails 默认会在something_id 上添加一个索引

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-10
        • 2012-09-17
        相关资源
        最近更新 更多