Rails中的外键3

Jas*_*ett 11 ruby-on-rails

据我所知,根据Rails的理念,数据完整性检查应该在应用程序级别而不是数据库级别完成.像许多其他开发人员一样,我热情地不同意.

我发现了很多关于解决这个问题的讨论,但它们似乎都很老了,令人沮丧的是,它们似乎指向了不同的解决方案.

我不得不想象在Rails 3中有一个事实上的标准方法来做外键约束.然而,无论它是什么(如果它确实存在)似乎被所有过去的讨论所扼杀,因为我找不到它.

Rails开发人员到目前为止主要与外键在同一页面上吗?如果是这样,我很想知道它们是如何处理的.

Oma*_*shi 6

正是出于这个原因,我(以及编写Enterprise Rails的人 - http://oreilly.com/catalog/9780596515201)建议您在SQL中编写完整的上下迁移.

优点是:

  • 能够在创建表时添加外键 - 没有单独的alter table
  • 它允许您使用特定于数据库的字段类型 - 如tsvectors
  • 它允许您添加不同类型的索引 - 如Gin或Gist
  • 它允许您编写函数和/或触发器
  • 您不必记住DSL类型与SQL字段类型相关的内容 - 例如:number

有缺点:

  • 它不是数据库不可知的(谁关心你多久更换一次数据库?)
  • 它不是Ruby(但每个优秀的Rails开发人员都应该知道SQL,对吧?)

但是,总的来说,我认为优点胜过劣势.

快速举例:

  def self.up
    execute <<EOS

create table .... (
  ....
);

EOS
   end
Run Code Online (Sandbox Code Playgroud)