【问题标题】:How do you automatically add foreign keys to an existing Rails database?如何自动将外键添加到现有的 Rails 数据库?
【发布时间】:2016-07-03 18:51:12
【问题描述】:

我是 Ruby 新手,并加入了一个现有的 Ruby on Rails 项目,试图了解数据库以重新架构它。

如果我生成一个 MySql 图,我发现 Rails 不使用外键,因此无法分析该图:

但是 Ruby 在内部显然可以理解表关系。是否有任何脚本可以通过所有迁移 .rb 脚本并自动向它们添加外键?

【问题讨论】:

  • 所有信息都编码在您的rails应用程序的模型中,您可以在这里搜索belongs_to和has_many。
  • 不太清楚“rails 不使用外键”是什么意思,而且屏幕截图中的文字太小而无法阅读。
  • 应该可以不费力地编写一个脚本来执行此操作,但是您将无法为多态关联创建外键(您有两列:一列带有 id,和一个模型名称),因为这不是您可以在 MySQL(或任何其他数据库引擎,AFAIK)中执行的操作。
  • @max - Rails 不在数据库中创建外键。由于 Rails 数据库中没有参照完整性,因此屏幕截图显示表之间没有行。
  • @Carpetsmoker 你知道任何现有的代码让我开始吗?我在迁移脚本中看不到任何关系,我猜它们隐藏在主要应用模型中的某个地方。

标签: mysql ruby-on-rails activerecord


【解决方案1】:

“Rails 不使用外键”的说法根本不正确。

ActiveRecord 不要求您对关联使用外键约束。但是,当您使用 referencesbelongs_to 迁移宏时,它会默认添加外键约束。

rails g model thing other_thing:references

因此,如果您要接管一个没有或几乎没有参照完整性的遗留项目,那是开发人员的错 - 而不是 Rails。木匠喝醉了,别怪锤子。

了解何时以及如何使用索引和约束实际上非常困难,而要做到这一点,构建自动化可能比首先实际解决任务复杂一个数量级。

您实际上需要查看架构和模型,查看应在何处添加外键并创建迁移以添加这些外键。

【讨论】:

  • 嗯...我认为将不使用数据库约束与“醉酒”木工进行比较是不明智的。许多人认为它与 Rails 的“约定优于配置”中间集一致,改为在模型中使用关系和验证,并且将数据库视为平面数据存储为开发人员打开了其他非 SQL 数据库选项。文档还提到“不需要”外键约束:guides.rubyonrails.org/…
【解决方案2】:

将在https://github.com/jenseng/immigrant 找到的移民宝石添加到您的 Gemfile 中,然后

rails generate immigration AddKeys
rake db:migrate

如果您使用的是旧版本的 Rails,您还需要包含 foreigner gem。

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多