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

sha*_*esh 7 ruby-on-rails ruby-on-rails-3

使用t.references和执行SQL命令在productscategorytable 之间创建外键关系有什么区别,如下所示?换句话说,两种不同的方式做同样的事情还是我错过了什么?

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
Run Code Online (Sandbox Code Playgroud)

Pri*_*ain 0

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

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

来自评论:

Rails 不使用外键来执行后端任务。这是因为某些数据库(例如 sqlite)不允许在其表上使用外键。所以 Rails 不提供构建外键的帮助器

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

  • Rails 4.2 现在支持支持它们的适配器的外键约束:http://edgeguides.rubyonrails.org/4_2_release_notes.html#foreign-key-support (4认同)