Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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应用程序中将外键添加到数据库_Ruby On Rails_Ruby_Database_Postgresql - Fatal编程技术网

Ruby on rails 在Rails应用程序中将外键添加到数据库

Ruby on rails 在Rails应用程序中将外键添加到数据库,ruby-on-rails,ruby,database,postgresql,Ruby On Rails,Ruby,Database,Postgresql,使用PostgreSQL,我知道Rails不在数据库中使用外键,而是通过has\u one,has\u many来处理所有关系。。。。还有很多其他的,我知道像这样的宝石可以帮上忙 但是,在数据库表中添加外键是否值得,以及为什么有人愿意添加外键?实际上,ActiveRecord的关系需要在数据库中添加外键。按照惯例,它的名称是{table}\u id 文件: (查找关键字“迁移”) 编辑: 在列上添加索引实际上可以帮助您进行更快的查询。PostgreSQL会自动为每个主键约束创建一个索引,但无需添

使用
PostgreSQL
,我知道Rails不在数据库中使用外键,而是通过has\u one,has\u many来处理所有关系。。。。还有很多其他的,我知道像这样的宝石可以帮上忙


但是,在数据库表中添加外键是否值得,以及为什么有人愿意添加外键?

实际上,ActiveRecord的关系需要在数据库中添加外键。按照惯例,它的名称是
{table}\u id

文件: (查找关键字“迁移”)

编辑:

在列上添加索引实际上可以帮助您进行更快的查询。PostgreSQL会自动为每个主键约束创建一个索引,但无需添加外键约束即可创建索引列


因此,只要在
id
{table}\u id
列上有索引,就不需要添加外键约束来加快查询速度。

实际上,ActiveRecord的关系需要数据库中的外键。按照惯例,它的名称是
{table}\u id

文件: (查找关键字“迁移”)

编辑:

在列上添加索引实际上可以帮助您进行更快的查询。PostgreSQL会自动为每个主键约束创建一个索引,但无需添加外键约束即可创建索引列

因此,只要在
id
{table}\u id
列上有索引,就不需要添加外键约束来加快查询速度。

我认为这是确保数据完整性和一致性的工具

而a用于加快查询速度

它们看起来很相似,经常在相同的上下文中使用,但它们并不相同


顺便说一句,没有必要使用宝石般的外国人。支持外键,因为Rails 4.2是现成的。看看:

或者您可以使用
所属
上的
外键
,以及
引用
数据类型:

create_table :posts do |t|
  t.references :user, foreign_key: true
  t.timestamps
end
我认为这是确保数据完整性和一致性的工具

而a用于加快查询速度

它们看起来很相似,经常在相同的上下文中使用,但它们并不相同


顺便说一句,没有必要使用宝石般的外国人。支持外键,因为Rails 4.2是现成的。看看:

或者您可以使用
所属
上的
外键
,以及
引用
数据类型:

create_table :posts do |t|
  t.references :user, foreign_key: true
  t.timestamps
end
Rails(或ActiveRecord)只是数据库中条目的简单ORM。它没有利用DB提供的大多数功能。部分原因是,他们希望与数据库无关,而且许多更高级的特性都是DBM特有的。但也因为有些人认为,将逻辑放入DBs是所有邪恶的根源

这并不意味着一切都是邪恶的,而是应该谨慎使用。尤其是存储过程。也就是说,我认为外键约束和索引在Rails中使用不足。创建它们没有很多缺点(除了种子设定)

例如,可以在“有一个”关系上利用唯一键约束来防止多个记录。默认情况下,Rails不会这样做。您可以依赖验证,但使用DB是更安全的选择:

add_index :child_table, [:parent_id], unique: true
您还可以利用外键约束自动让DB删除从属记录:

add_foreign_key :children, :parents, column: :parent_id, dependent: :delete
您可以将两者结合使用:

add_foreign_key :children, :parents, column: :parent_id, dependent: :delete, index: { unique: true }
有很多方法可以利用数据库来确保数据的完整性和一致性

如果您现在使用引用创建rails迁移,它实际上会为您创建索引和外键约束:

 ~blog $ rails g model Post author:references title:string content:text

Running via Spring preloader in process 33539
      invoke  active_record
      create    db/migrate/20160308141214_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml

~/blog $ cat db/migrate/20160308141214_create_posts.rb

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.references :author, index: true, foreign_key: true
      t.string :title
      t.text :content

      t.timestamps null: false
    end
  end
end
~blog$rails g模型文章作者:引用标题:字符串内容:文本
通过过程33539中的弹簧预紧器运行
调用活动记录
create db/migrate/20160308141214_create_posts.rb
创建app/models/post.rb
调用测试单元
创建测试/模型/post_test.rb
创建test/fixtures/posts.yml
~/blog$cat db/migrate/20160308141214\u create\u posts.rb
类CreatePosts
Rails(或ActiveRecord)只是数据库中条目的简单ORM。它没有利用DB提供的大多数功能。部分原因是,他们希望与数据库无关,而且许多更高级的特性都是DBM特有的。但也因为有些人认为,将逻辑放入DBs是所有邪恶的根源

这并不意味着一切都是邪恶的,而是应该谨慎使用。尤其是存储过程。也就是说,我认为外键约束和索引在Rails中使用不足。创建它们没有很多缺点(除了种子设定)

例如,可以在“有一个”关系上利用唯一键约束来防止多个记录。默认情况下,Rails不会这样做。您可以依赖验证,但使用DB是更安全的选择:

add_index :child_table, [:parent_id], unique: true
您还可以利用外键约束自动让DB删除从属记录:

add_foreign_key :children, :parents, column: :parent_id, dependent: :delete
您可以将两者结合使用:

add_foreign_key :children, :parents, column: :parent_id, dependent: :delete, index: { unique: true }
有很多方法可以利用数据库来确保数据的完整性和一致性

如果您现在使用引用创建rails迁移,它实际上会为您创建索引和外键约束:

 ~blog $ rails g model Post author:references title:string content:text

Running via Spring preloader in process 33539
      invoke  active_record
      create    db/migrate/20160308141214_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml

~/blog $ cat db/migrate/20160308141214_create_posts.rb

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.references :author, index: true, foreign_key: true
      t.string :title
      t.text :content

      t.timestamps null: false
    end
  end
end
~blog$rails g模型文章作者:引用标题:字符串内容:文本
通过过程33539中的弹簧预紧器运行
调用活动记录
create db/migrate/20160308141214_create_posts.rb
创建app/models/post.rb
调用测试单元
创建测试/模型/post_test.rb
创建test/fixtures/posts.yml
~/blog$cat db/migrate/201603081412