マイグレーションの様々な機能
まずテーブルを作成する前にカラムを追加できる型の種類を知っておく必要があるのではじめに主に使われるデータ型をまとめてみる。
データ型
データ型 | 説明 |
---|---|
:boolean | 真偽値 |
:integer | 符号付き整数 |
:float | 浮動少数点数 |
:string | 文字列(短い文字列に利用する) |
:text | 文字列(長い文字列に利用する) |
:date | 日付 |
:datetime | 日時 |
他にもたくさんあるが主に使われるデータ型をまとめた。
次にマイグレーションの代表的な個々のパターンについてまとめる。
新規テーブルを作成する
一番一般的なやり方だと思うが、モデルを作成することによって自動的にテーブルを作成する。
ここでは例としてFoodモデル(name属性を持つ)を作成してみる。
$ rails g model Food name:string
この結果
class CreateFoods < ActiveRecord::Migration[5.2] def change create_table :foods do |t| t.string :name t.timestamps end end end
Foodモデルを作成したことによってfoodsテーブルが作成され、カラムとしてname(string文字列)を追加するとを表している。
既存のテーブルにカラムを追加する
上記で作成したFoodモデル(foodsテーブル)に新しいカラムを追加します。
ここでは例としてdescription(string文字列)カラムを追加します。
すでにFoodモデル(foodsテーブル)を作成しているので、マイグレーションファイルだけrails g コマンドで作成する。
$ rails g migration add_description_to_foods description:string
上記のコマンドではrails g コマンドでマイグレーションを作成し、ファイル名は「addカラム名to_テーブル名」とし、そのあと追加するカラムを指定している。
この結果、
class AddDescriptionToFoods < ActiveRecord::Migration[5.2] def change add_column :foods, :description, :string end end
add_columnメソッドを使用してfoodsテーブルにdescriptionカラムが追加されていることがわかる。
既存のテーブルのカラム属性を変更する
descriptionカラムを追加したが複数行の文字列に対応させたいとします。現在の属性タイプではstringで複数行の文字列にはふさわしくないのでtextタイプに変更しなければいけない。
このような場合に変更するための適切な名前のルールはない。ここではchange_datatype_description_of_foodsといいう名前のマイグレーションファイルを作成する。
$ rails g migration change_datatype_description_of_foods
ここではオプションを設定していないので下記のようなマイグレーションが作成されていることがわかる。
class ChangeDatatypeDescriptionOfFoods < ActiveRecord::Migration[5.2] def change end end
このマイグレーションファイルにカラムを変更するための記述を行う。
カラムの変更を行うにはchange_columnメソッドを使用する。
change_columnの後にモデル名、テーブル名、変更する属性とする。
class ChangeDatatypeDescriptionOfFoods < ActiveRecord::Migration[5.2] def change change_column :foods, :description, :text end end
これでfoodsテーブルのdescription属性タイプをtextに変更することができる。
他にも色々な方法でマイグレーションの設定ができるが基本的なテーブルの作成、カラムの追加、カラム属性の変更ができるようになった。
マイグレーションのメソッド
上記でテーブルの作成、カラムの追加、カラム属性の変更ができるようになったがもっと柔軟にマイグレーションが扱えるようにマイグレーションのテーブルを操作するメソッドやテーブル操作の中で使用できるメソッドをまとめてみる。
マイグレーションのテーブル操作メソッド
メソッド | 役割 |
---|---|
change |
テーブルの作成、カラムの追加、削除を行う場合に使用する。最も利用されるメソッド |
up |
rollbackが働くよう、スキーマに対する変更を記述する。up(変更記述) / down(戻し記述) |
down |
rollbackが働くよう、upメソッドによって追加されたスキーマの変更を「元に戻す」方法を記述する。up / downは対になって利用される |
reversible |
changeメソッドだけで簡単にマイグレーションのロールバックを判定できないような場合に、up / downを使用して「変更」と「戻し」の処理をreversibleの中に取り込み、どちら向きの変更処理でも常に同じ方向の処理ができるようにする |
revert |
実行済みのマイグレーションの一部のみをロールバック(元に戻す)場合に使用する。戻したい実行済みのマイグレーション記述をコピーし、revertブロック野中に組み込むことでロールバックを実現する |
テーブル操作メソッドの中で使用できるメソッド
メソッド | 構文 | 役割 |
---|---|---|
create_table | create_table :テーブル名 [, オプション] | テーブルを作成する |
drop_table | drop_table :テーブル名 [, オプション] | テーブルを削除する |
rename_table | rename_table :現在のテーブル名, :新しいテーブル名 | テーブル名を変更する |
change_table | change_table :テーブル名 [, オプション] | テーブル設定を変更する |
add_column | add_column :テーブル名 :カラム名, :データ型 [, オプション] | カラムを追加する |
add_reference | add_reference :テーブル名, :リファレンス名 [, オプション] | 外部キーリファレンスを追加する(親子のアソシエーションで使用可能) |
add_timestamps | add_timestamps :テーブル名 | タイムスタンプ(登録日、更新日を追加する) |
rename_column | rename_column :テーブル名, :変更するカラム名, :新しいカラム名 | カラム名を変更する |
change_column | change_column :テーブル名, カラム名, :データ型 [, オプション] | カラム設定を変更する |
remove_column | remove_column :テーブル名, :カラム名 [, :データ型, オプション] | カラムを除去する |
remove_reference | remove_reference :テーブル名, リファレンス名 [, オプション] | 外部リファレンスキーを除去する |
remove_timestamps | remove_timestamps :テーブル名 | タイムスタンプ(登録日、更新日)を除去する |
add_index | add_index :テーブル名, :インデックスを付与するカラム名 [, オプション] | インデックスを追加する |
rename_index | rename_index :テーブル名, :旧インデックス名, :新インデックス名 | インデックス名を変更する |
remove_index | remove_index :テーブル名 [, オプション] | インデックスを削除する |
まとめ
モデルの作成は簡単だが、マイグレーションファイルのみ作成し、自分でカラムを追加したり削除したりすることはあまりやってなかったのでこれで理解できるようになった。
すべてのメソッドを使いこなせるにはまだまだ時間がかかりそうだが、柔軟にマイグレーションファイルを使いこなせるようにしていきたい。