前提知識
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
次に
rails db:migrate
を実行する。schemaに以下の様に記述される。
カラム名:その型1以上指定した場合
ex. ) rails generate model Player name:string age:integer height:integer
作成されるmigrationfile
shemaが更新されます。
名前がplayersのテーブルが作られ、カラムには以下の三つが存在する。
名前にstring型、年齢にinteger型、高さにinteger型を持つカラム
さて、本題に入りましょう
大前提として、ターミナルで打つコマンドからはdefault値を指定できません。じゃあ、どうするの?
migration fileをいじくり、それをmigarateすることでdefault値を設定します。
default値を設定したいタイミングは以下の通りが考えられるのでそれに沿って説明します。今回はadminにdefaul値を設定します。
・テーブルまたはカラムをまだ作成していない時
・既存のdefault値を変更する
・既に存在するカラムにdefault値を設定する
- テーブルまたはカラムをまだ作成していない時
rails generate migration User name:string age:integer height:integer admin:string
を実行すると以下のmigration fileが作成されます。
adminの後にdefault: faulsを設定してあげます。
後はmigrateを実行すれば完成です。
rails db:migrate
schemaにdefaultが作られていることを確認する。
rollbackが可能(この場合はtableを作る作業の逆、つまり削除が実行される。)
2,・既存のdefault値を変更する
現状は以下の様になっている。
scheme
ここから、trueをfalseに変更したい。
rails generate migration change_column_cats
を実行する。そうすると、以下のmigration fileが作成される。
rails db:migrateを実行する。
adminのdefault値がfalseからtrueになってるのが確認できる。
ただし、この書き方だとrollbackすることができません。
試しにしてみると、、、
この様に怒られます。
rollbackは元の状態がわかる必要があります。そのため、以下の様に記述を変えてあげるとかぎゃくせいを持たせる事ができます。
以下は時間がある時に追加します。
3.既に存在するカラムにdefault値を設定する
1、2の組み合わせで解決できます。
rollbackを気にしない時
rollbackを気にする時
SQLでのカラムのdefault値はnullになっています。なので、何も指定しない状態だとfrom:〜〜 to:falseの〜〜部分はnilに設定してあげればOKです。