外键约束与Rails中引用的区别

时间:2012-07-18 05:52:37

标签: ruby-on-rails ruby-on-rails-3

使用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

2 个答案:

答案 0 :(得分:2)

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

add_index :products, :category_id

<强>更新

Rails 5现在实际上完全相同。所以,回答最初的问题:现在两者都是一样的。

答案 1 :(得分:0)

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

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

来自评论:

  

Rails不使用外键来执行后端任务。这个   因为像sqlite这样的某些db不允许在其表上使用外键。   因此Rails不提供构建外键的帮助程序

还有一个gem foreigner用于向数据库表添加外键。 What creates the FOREIGN KEY constraint in Ruby on Rails 3?