しおブログ言うてますけど

技術ブログ言うてますけど技術以外のことも発信すると思われ。RubyとかRuby on Railsとか生き方とかジャンルにこだわらず自分の好きなように。初心者なのでお手柔らかに。

マイグレーションの様々な機能

まずテーブルを作成する前にカラムを追加できる型の種類を知っておく必要があるのではじめに主に使われるデータ型をまとめてみる。

データ型

データ型 説明
: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 :テーブル名 [, オプション] インデックスを削除する

まとめ

モデルの作成は簡単だが、マイグレーションファイルのみ作成し、自分でカラムを追加したり削除したりすることはあまりやってなかったのでこれで理解できるようになった。
すべてのメソッドを使いこなせるにはまだまだ時間がかかりそうだが、柔軟にマイグレーションファイルを使いこなせるようにしていきたい。