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
添加到迁移中,并为关联创建索引。