8

以下に示すように、とテーブルの間に外部キー関係を作成するためにコマンドを使用t.referencesすることと実行することの間に違いはありますか?言い換えれば、同じことをする2つの異なる方法ですか、それともここで何かが欠けていますか?SQLproductscategory

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 に答える