8

t.references使用和执行命令创建和表SQL之间的外键关系有什么区别,如下所示?换句话说,是做同一件事的两种不同方式还是我在这里遗漏了什么?productscategory

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
4

2 回答 2

3

他们不是一回事。默认情况下,Rails 不会在数据库中强制使用外键。相反,从命令行创建时的引用也会创建一个常规索引,如下所示:

add_index :products, :category_id

更新:

Rails 5 现在实际上做了同样的事情。所以,回答最初的问题:如今,两者都是一样的。

于 2012-07-18T05:58:07.043 回答
0

我在这个页面中发现了一些有趣的东西。

http://railsforum.com/viewtopic.php?id=17318

来自评论:

Rails 不使用外键来执行他的后端任务。这是因为一些像 sqlite 这样的数据库不允许在其表上使用外键。所以 Rails 没有提供帮助来构建外键

还有一个 gem foreigner用于向数据库表添加外键。 是什么在 Ruby on Rails 3 中创建了 FOREIGN KEY 约束?

于 2012-07-18T06:12:20.167 回答