Ruby on rails Rails中外键约束和引用之间的差异
使用Ruby on rails Rails中外键约束和引用之间的差异,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,使用t.references和执行SQL命令在产品和类别表之间创建外键关系是否有任何区别,如下所示?换句话说,这两种不同的方法是做同一件事还是我遗漏了什么 class ExampleMigration < ActiveRecord::Migration def up create_table :products do |t| t.references :category end #add a foreign key execute <&
t.references
和执行SQL
命令在产品
和类别
表之间创建外键关系是否有任何区别,如下所示?换句话说,这两种不同的方法是做同一件事还是我遗漏了什么
class ExampleMigration < ActiveRecord::Migration
def up
create_table :products do |t|
t.references :category
end
#add a foreign key
execute <<-SQL
ALTER TABLE products
ADD CONSTRAINT fk_products_categories
FOREIGN KEY (category_id)
REFERENCES categories(id)
SQL
add_column :users, :home_page_url, :string
rename_column :users, :email, :email_address
end
def down
rename_column :users, :email_address, :email
remove_column :users, :home_page_url
execute <<-SQL
ALTER TABLE products
DROP FOREIGN KEY fk_products_categories
SQL
drop_table :products
end
end
class ExampleMiggration 执行它们不是一回事。默认情况下,Rails不会在数据库中强制使用外键。相反,从命令行创建引用时也会创建常规索引,如下所示:
add_index :products, :category_id
更新:
Rails 5现在实际上做了完全相同的事情。所以,为了回答最初的问题:现在,两者都是一样的。我在这一页中发现了一些有趣的东西
在评论中:
Rails不使用外键来执行其后端任务。这
因为像sqlite这样的数据库不允许在其表上使用外键。
因此Rails不提供帮助程序来构建外键
还有一个用于向数据库表添加外键的gem。
Rails 4.2现在为支持外键的适配器支持外键约束:Rails中的引用本质上就是外键上的外键+索引吗?@geoboy这在更新的版本中实际上已经改变了t.references
还设置带索引的外键。我就是这么想的。但是如果我分别设置外键和索引,那么它会有相同的效果吗?或者在schema.db
文件中有t.references
(而不是foreign\u key
和index
)有什么好处呢?因此,现在,要在两个现有表之间生成关系,比如说Author
和Books
,我们只需要一个外键或引用吗?例如,rails g migration AddAuthorToBooks author:references
?现在,您可以将index:true
添加到迁移中,并为关联创建索引。