Ruby on Rails マイグレーションのあれこれ

どうも、tatsuです!

今回はRuby on Rails マイグレーションについての記事になります。

 
Railsで開発をしていくと、テーブルのカラムを追加・削除・変更したいといったことが出てくると思います。

そんな時にマイグレーションを使うことで、簡単にテーブルを変更することができます。

マイグレーションとは

マイグレーションとは、テーブル作成やカラムの追加などを楽に行えるようにしてくれる機能です。

Railsでmodelを作ったあとに「rails db:migrate」とするとテーブルにもmodelの内容を反映してくれると習いませんでしたか??

あれ、実はmodel生成時にmodelに対応したマイグレーションファイル(SQLっぽいものが書かれています)というものが生成され、「rails db:migrate」とすることでマイグレーションファイルの内容を適用していたんです。

同じように、変更したい内容を記述したマイグレーションファイルを作って、「rails db:migrate」を実行することでマイグレーションファイルを適用することができますので、やり方を見ていきましょう!

マイグレーションファイルを生成する

マイグレーションファイルは以下のコマンドを実行することで生成されます。

rails g migration ファイル名

成功するとdb/migrateディレクトリにマイグレーションファイルができているはずです。

マイグレーションファイルの名前
マイグレーションファイルは以下のような名前のファイルになります。
「年月日時分秒_名前.rb」

年月日時分秒は自動で付けられ、名前はmigrationコマンド時に指定した名前です。

マイグレーションファイルの名前は一意にする必要があるため、できるだけmigrationコマンド時に指定する名前は具体的な名前にしましょう。
例)rails g migration AddSubCommentToSamples

ここで生成されたマイグレーションファイル1つ1つが1バージョンとして扱われます。
日付が新しいほうが新しいバージョンですね。

マイグレーションファイルの書き方

作成されたマイグレーションファイルの中身は雛形しかないため、以下のようになっているかと思います。

class AddSubCommentToSamples < ActiveRecord::Migration[5.2]
  def change
  end
end

ここではいくつか書き方を紹介します。

カラムを追加する

カラムを追加するには以下のように記述します。

class AddSubCommentToSamples < ActiveRecord::Migration[5.2]
  def change
    add_column :テーブル名, :追加するカラム名, :データ型
  end
end

例)

class AddSubCommentToSamples < ActiveRecord::Migration[5.2]
  def change
    add_column :samples, :add_comment, :string
  end
end

カラムを削除する

カラムを削除するには以下のように記述します。

class AddSubCommentToSamples < ActiveRecord::Migration[5.2]
  def change
    remove_column :テーブル名, :削除するカラム名, :データ型
  end
end

例)

class AddSubCommentToSamples < ActiveRecord::Migration[5.2]
  def change
    remove_column :samples, :add_comment, :string
  end
end

カラムを変更する

カラムを追加するには以下のように記述します。

class AddSubCommentToSamples < ActiveRecord::Migration[5.2]
  def change
    change_column :テーブル名, :変更するカラム名, :変更したいデータ型
  end
end

例)

class AddSubCommentToSamples < ActiveRecord::Migration[5.2]
  def change
    change_column :samples, :add_comment, :text
  end
end

複数カラムを変更する

もちろん以下のように複数記述することもできます。

class AddSubCommentToSamples < ActiveRecord::Migration[5.2]
  def change
    add_column :samples, :add_comment, :string
    remove_column :samples, :title, :string
    change_column :samples, :body, :string
  end
end

 
他にもできることがたくさんあるので、慣れてきたら公式ドキュメントActiveRecord マイグレーションを読んでみてください。

マイグレーションファイルを適用する

マイグレーションファイルを適用するには以下のコマンドを使います。

rails db:migrate

が、マイグレーションファイルを適用するコマンドは他にもありますので少しご紹介します。

コマンド 説明
rails db:migrate 最新バージョンまでのマイグレーションファイルを適用する。
rails db:migrate VERSION=年月日時分秒 マイグレーションファイル名の年月日時分秒部分を指定することで、そのバージョンまでのマイグレーションファイルを適用する。
rails db:rollback バージョンを1個戻す。
rails db:rollback STEP=n バージョンをn個戻す。

上記からもわかるとおり、マイグレーションとはバージョンを進めるだけでなく戻すこともできるんですね!

現時点でのデータベースのスキーマ構造を把握する

A5ツールなどを使って直接テーブルを覗いても確認することができますが、Railsではdb/schema.rbというファイルに現時点のスキーマ構造が記述されています。

こんな感じです↓↓

ActiveRecord::Schema.define(version: 2018_10_18_132917) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "samples", force: :cascade do |t|
    t.string "title"
    t.text "body"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end

schema.rbは「rails db:migrate」や「rails db:rollback」などを行うたびに最新に書き換えられます。

試しに一度見てみてはいかがでしょうか。

まとめ

今回はマイグレーションについてあれこれご紹介してきました。

実際の開発ではテーブル追加・カラム変更などよくあるので、使い方をマスターしておいて損はないですよ♪

それでは!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です