Ruby
Rails
RubyOnRails
Rails4

Railsマイグレーションのindex、foreign_keyの設定

migrationファイルを書いていて、index,foreign_keyの設定の仕方でハマったので、調べたことを共有できればと思います

インデックス(index)

インデックスの追加(add_index)

基本的な書き方

# add_index :対象のテーブル名, インデックス対象のカラム名    
  add_index :company, :company_name

複合インデックスの場合

# add_index :対象のテーブル名, インデックス対象のカラム名  
  add_index :company, [:company_code, :compnay_name]

オプション

  1. 別名をつける場合
# add_index :対象のテーブル名, インデックス対象のカラム名, :name インデックスの別名    
  add_index :company, :company_name, name: :hogehuga_fk

インデックスの削除(remove_index)

# remove_index :対象のテーブル名, インデックス名  
  remove_index :company, name: :company_name_fk

外部キー(foreign_key)

外部キーの追加(add_foreign_key)

基本的な書き方

# add_foreign_key :対象のテーブル, :指定先のテーブル  
  add_foreign_key :companies, :accounts

複合外部キーの場合

対応していなさそうなので、SQL書いて頑張るしかなさそうです…

execute <<-SQL.gsub(/^\s+/, '')
  ALTER TABLE companies
  ADD company_type VARCHAR(255) NOT NULL DEFAULT 'Alliance',
  ADD CONSTRAINT companies_fk
  FOREIGN KEY (companies_division_id, company_type, company_id)
  REFERENCES company_divisions (id, company_type, company_id);
  SQL

オプション

  1. カラムの指定
# add_foreign_key :対象のテーブル, :指定先のテーブル, :column :対象のカラム名  
  add_foreign_key :companies, :accounts, column: :hoge_id
  1. 別名をつける場合
 # add_foreign_key :対象のテーブル, :指定先のテーブル, name: :foreign_keyの別名  
   add_foreign_key :companies, :accounts,  name: :huga_id

外部キーの削除(remove_foreign_key)

# remove_foreign_key :対象のテーブル, :指定先のテーブル  
  remove_foreign_key :companies, :accounts