Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3中的外键_Ruby On Rails - Fatal编程技术网

Ruby on rails Rails 3中的外键

Ruby on rails Rails 3中的外键,ruby-on-rails,Ruby On Rails,我理解,根据Rails的原理,数据完整性检查应该在应用程序级别而不是数据库级别进行。和许多其他开发人员一样,我强烈反对 我发现有很多关于这个问题的讨论,但它们似乎都很陈旧,令人沮丧的是,它们似乎指向不同的解决方案 我不得不想象在Rails3中有一种事实上的标准方式来执行外键约束。然而,无论它是什么(如果它确实存在的话),似乎都被过去所有的讨论所扼杀,因为我找不到它 到目前为止,Rails开发人员大部分都使用外键在同一页面上吗?如果是这样,我很想知道他们通常是如何处理的。 “尽管Active Re

我理解,根据Rails的原理,数据完整性检查应该在应用程序级别而不是数据库级别进行。和许多其他开发人员一样,我强烈反对

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

我不得不想象在Rails3中有一种事实上的标准方式来执行外键约束。然而,无论它是什么(如果它确实存在的话),似乎都被过去所有的讨论所扼杀,因为我找不到它

到目前为止,Rails开发人员大部分都使用外键在同一页面上吗?如果是这样,我很想知道他们通常是如何处理的。


“尽管Active Record没有提供任何直接使用这些功能的工具,但execute方法可用于执行任意SQL。还有许多插件,如外键迁移,它们为Active Record添加外键支持。”

正是出于这个原因,我(以及编写Enterprise Rails的人员-)建议您使用SQL编写整个上下迁移

优点是:

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

  • 这不是数据库不可知论(谁在乎,你会多久更改一次数据库?)
  • 它不是Ruby(但每个优秀的Rails开发人员都应该知道SQL,对吧?)
但是,总的来说,我认为利大于弊

快速示例:

  def self.up
    execute <<EOS

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

EOS
   end
def self.up

执行前几天我发现自己问了同样的问题,所以我做了一些研究并整理了我的研究结果。我希望那是有用的


顺便说一句,当你说你“非常不同意”数据完整性检查应该在应用程序级别而不是数据库级别进行时,我想你的意思是它们应该在两个级别进行,而不仅仅是在数据库级别。我希望我的想法是正确的,几乎每个人都同意在应用程序级别进行完整性检查是一件好事,唯一争论的话题是是否应该在数据库中另外进行完整性检查。

回答得不错。我是否可以建议使用
是的,这也是非常合理的-尽管-我有点奇怪,并且喜欢确保我的SQL正确对齐-特别是如果在同一个迁移中编写两个函数/触发器。我想这就是我将要做的。出于好奇,这是否意味着我无法一次性生成表格和模型?我是否必须用SQL编写表定义,然后分别创建一个匹配的模型?您可以执行rails g模型Foo,然后删除create_table:Foo位。