ActiveRelationでdefault値を設定する方法

前提知識
RailsではActiveRecordがORマピイングシステムでDBとやりとりをしている。

ORマッピング
　railsで決められている方法で記述するだけで、データベースの種類に関係なく、データを扱える仕組み。
利点
・DBの種類毎に変わる記述方法を気にしなくて済む

migration file
DBに反映させたい情報を記載したfile

rails db:migrateを実行すると
timeスタンプの順番に沿って各fileの内容が実行される。

schema
DBへ反映させるための情報が記載されたfile
migration fileの情報を反映させたのがschema
schemaがDBと直接やりとりしている。

使い方。
ターミナルで以下のコマンドを実行する。
rails generate model モデル名　カラム名:その型

モデル名は単数形で先頭は大文字
カラム名:その型、は複数指定できる（書かなくても良い）

カラム名:その型を1つも指定しない場合
ex. ) rails generate model User

作成されるmigration file
<img width="477" alt="スクリーンショット 2019-07-07 13.39.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/bd52ec25-de7c-7251-7708-7b52aeb70617.png">

<img width="608" alt="スクリーンショット 2019-07-07 21.46.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/c3147fd1-28b6-3ad9-ee61-ea6abc046b4d.png">


次に
rails db:migrate
を実行する。schemaに以下の様に記述される。

<img width="627" alt="スクリーンショット 2019-07-07 13.40.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/b350a02f-60b5-60aa-d187-2aff6c5cc4d1.png">

カラム名:その型1以上指定した場合
ex. ) rails generate model Player name:string age:integer height:integer

作成されるmigrationfile


次に
rails db:migrate
を実行する　
<img width="494" alt="スクリーンショット 2019-07-07 21.52.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/e1fe0c02-7f45-e793-bf73-7c58b85ab898.png">


shemaが更新されます。
名前がplayersのテーブルが作られ、カラムには以下の三つが存在する。
名前にstring型、年齢にinteger型、高さにinteger型を持つカラム

<img width="514" alt="スクリーンショット 2019-07-07 13.45.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/452742ea-9bd2-22ff-6f19-96d6869f0b87.png">


さて、本題に入りましょう
大前提として、ターミナルで打つコマンドからはdefault値を指定できません。じゃあ、どうするの？
migration fileをいじくり、それをmigarateすることでdefault値を設定します。
default値を設定したいタイミングは以下の通りが考えられるのでそれに沿って説明します。今回はadminにdefaul値を設定します。
・テーブルまたはカラムをまだ作成していない時
・既存のdefault値を変更する
・既に存在するカラムにdefault値を設定する


1.  テーブルまたはカラムをまだ作成していない時
rails generate migration User name:string age:integer height:integer admin:string
を実行すると以下のmigration fileが作成されます。
<img width="588" alt="スクリーンショット 2019-07-07 18.24.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/27afb6c5-4b54-2f52-6a47-55f182be8925.png">


adminの後にdefault: faulsを設定してあげます。
<img width="673" alt="スクリーンショット 2019-07-07 18.25.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/35b3eb6b-e4d4-7ca1-40bd-19874f403afa.png">


後はmigrateを実行すれば完成です。
rails db:migrate
schemaにdefaultが作られていることを確認する。
<img width="522" alt="スクリーンショット 2019-07-07 18.30.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/d1984d4e-ec27-4440-abcb-5d21199999e2.png">

rollbackが可能（この場合はtableを作る作業の逆、つまり削除が実行される。)
2,・既存のdefault値を変更する
現状は以下の様になっている。
scheme
<img width="522" alt="スクリーンショット 2019-07-07 18.30.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/658bfec5-f929-f6ab-c15e-df6cbcb878cd.png">

ここから、trueをfalseに変更したい。
rails generate migration change_column_cats
を実行する。そうすると、以下のmigration fileが作成される。

migration file
<img width="710" alt="スクリーンショット 2019-07-07 18.35.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/3a86eab7-b4bd-23e1-ef67-ccf396c09eaa.png">

ここにこう書き足す。
<img width="708" alt="スクリーンショット 2019-07-07 21.33.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/2bd263ce-a10e-2424-b43c-fcfa16eed6f2.png">

rails db:migrateを実行する。
<img width="633" alt="スクリーンショット 2019-07-07 21.33.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/22aefae5-34ec-4e4e-a9f7-d26e0f313c74.png">
adminのdefault値がfalseからtrueになってるのが確認できる。

ただし、この書き方だとrollbackすることができません。
試しにしてみると、、、
<img width="573" alt="スクリーンショット 2019-07-07 21.34.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/4b09b4cd-45e2-ee3e-060d-d5ca5ba452bf.png">

この様に怒られます。
rollbackは元の状態がわかる必要があります。そのため、以下の様に記述を変えてあげるとかぎゃくせいを持たせる事ができます。
<img width="681" alt="スクリーンショット 2019-07-07 21.58.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/26ae25cd-20fc-edd0-f8fe-3c469b319048.png">

以下は時間がある時に追加します。
3.既に存在するカラムにdefault値を設定する

１、２の組み合わせで解決できます。
rollbackを気にしない時

rollbackを気にする時
SQLでのカラムのdefault値はnullになっています。なので、何も指定しない状態だとfrom:〜〜  to:falseの〜〜部分はnilに設定してあげればOKです。