マイグレーションを使ったカラムの追加、削除、データ型の変更　[ 自分用メモ ]

<h1>カラムの追加</h1>
<h3>やり方１</h3>
$ rails g migration Addカラム名Toテーブル名 カラム名:型名
例:$ rails g migration AddHogeToHuga hoge:string　※ 外部キーのカラムのデータ型はinteger<br>
※最初のカラム名：先頭大文字
※テーブル名：先頭大文字
※最後のカラム名：先頭小文字
※型名：全て小文字
※テーブル名は元からある名前でOK。例) inquiriesとか。
「Addカラム名Toテーブル名」のカラム名とテーブル名は先頭を大文字にして記入します。
これでマイグレーションファイルを生成することができる。
	↓
※上記コマンドを実行したら、作成されたファイルを確認する
２つ目、３つ目のカラムを追加する場合は、作成されたマイグレーションファイルを編集し、保存する。
	↓
最後に
開発環境にマイグレーション処理を実行する
$ rake db:migrate
を実行してデータベースに反映させます。（生成されたマイグレーションファイルは削除しなくてもOK
※ コンソールでエラーが出たら、このコマンドを実行してない可能性が高い
																									
本番環境にマイグレーション処理を実行する
$ git push heroku master 後に
$ heroku run bundle exec rake RAILS_ENV=production db:migrate																								
**開発環境**
rails dbconsoleにして、
\d inquiries;	を実行し、テーブルにカラムが追加されたか確認する。																								
																									
**本番環境**
heroku pg:psql
SELECT * FROM テーブル名;
以上																		
																									
<h3>やり方２　※外部キーを追加するときのみ</h3>	
referencesを使用する
http://qiita.com/sinagaki58/items/7edea51ef00e393834ca
													
今回はtweetsモデルにuser_idを追加します。

```user.rb
has_many :tweets, dependent: :destroy
```

rails g migration AddUserRefToTweets user:references

```マイグレーション.rb
class AddUserRefToTweets < ActiveRecord::Migration
  def change
    add_reference :tweets, :user, index: true
  end
end
```

※referencesやbelongs_toを使うときは、カラムネームを指定する際に_id接尾子をつけません。																									
<br>

<h1>カラムの削除</h1>
rails g migration remove_カラム名 _ to _ テーブル名 カラム名
例) rails g migration remove_hoge_to_fuga hoge
これでマイグレーションファイルを生成することができる。
　　　　　　　　↓
生成されたファイルを確認する
例)
remove_column :companies, :company_name, :string
　　　　　　　　↓
あとは
rake db:migrate
を実行してデータベースに反映させる。

これで開発環境のテーブルからはカラムを削除できる。
但し、本番環境のテーブルからも削除するには、<br>
heroku run bundle exec rake RAILS_ENV=production db:migrate
を、実行する。

# データ型の変更（change_column）
http://ruby-rails.hatenadiary.com/entry/20140810/1407634200#migration-change-datatype

rails g migration change_datatype_title_of_articles
rails g migration change_datatype_カラム名 _ of _ テーブル名

```db/migrate/20140808183810_change_datatype_title_of_articles.rb
def change
    # [形式] change_column(テーブル名, カラム名, データタイプ, オプション)
    change_column :articles, :title, :text
end
```

# カラム名の変更
テーブル名：job_administrations
変更したいカラム名：request
変更後のカラム名：status

カラム名を変更するためのmigrationファイルを作成します。

$ rails g migration rename_request_column_to_job_administrations

db/migrate/20150629074110_rename_request_column_to_job_administrations.rb っていうファイルが作成されます。

作成されたファイルを開くと

```マイグレーション.rb
class RenameRequestColumnToJobAdministrations < ActiveRecord::Migration[5.0]
  def change
    rename_column :job_administrations, :request, :status
  end
end
```

# 後からデフォルト値の追加、NULL制約の追加を行う
rails g migration クラス名(任意 + クラス名)
rails g migration addDefaultToSailor_job_informations

http://ruby-rails.hatenadiary.com/entry/20140810/1407634200#migration-change-column-null

```db/migrate/20170504074521_add_default_to_sailor_job_informations.rb
class AddDefaultToSailorJobInformations < ActiveRecord::Migration[5.0]
  def change
    # デフォルト値を追加
    change_column_default :sailor_job_informations, :request, false
    change_column_default :sailor_job_informations, :inexperienced_person_search, false
    change_column_default :sailor_job_informations, :educational_qualification, false
    change_column_default :sailor_job_informations, :help_wanted, false
    change_column_default :sailor_job_informations, :new_arrival_job, false
    change_column_default :sailor_job_informations, :second_graduate, false

    # NULL制約を追加
    change_column_null :sailor_job_informations, :request, false
    change_column_null :sailor_job_informations, :inexperienced_person_search, false
    change_column_null :sailor_job_informations, :educational_qualification, false
    change_column_null :sailor_job_informations, :help_wanted, false
    change_column_null :sailor_job_informations, :new_arrival_job, false
    change_column_null :sailor_job_informations, :second_graduate, false
  end
end
```