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