マイグレーションファイルとスキーマファイルについて(migration, schema, rake)
2018/10/035 分で読める記事 — In プログラム

はじめに


こんにちは、みなさん。
ラーメンは柔らかめが好きな博多民に怒られるらーめん好きギノキンです。

本日は今までずっとモヤモヤしていた「マイグレーション」と「スキーマファイル」についてまとめてみました。

$ rails g model user name age hometown

をした前提で記事を書いております。

マイグレーションファイルについて


マイグレーションファイルというのは、テーブルを作成するための設計図みたいなものです。マイグレーションファイルを実行することで初めてテーブルが作られます。

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
       t.string :name
       t.string :age
       t.string :hometown

       t.timestamps
    end
  end
end

CreateUsersクラスで定義されているのは、changeメソッドのみです。changeメソッドは、このマイグレーションファイルが実行された際に呼ばれるメソッドです。

changeメソッドの中で、create_tableというメソッドが呼ばれていますが、これがその名の通りテーブルを作成する処理を行っています。

モデル作成コマンドで入力したように、3つのカラム(name、age、hometown)をそれぞれのデータ型(string)で作っているのが分かると思います。

t.timestampsというのは、このテーブルに書き込み・修正した際にそのタイムスタンプを保存しておく為のカラムを作っています。
t.timestampsによってcreated_atと、updated_atというタイムスタンプ用のカラムも作られている.後述)

このマイグレーションファイルを実行することで、その指示通りに、データベース内にusersテーブルが作られるわけです。

$ rake db:migrate


ここで、 rake コマンドの機能について

しかしながら、上記のコマンドは特にどのマイグレーションファイルを実行するかを指定していないにも関わらずusersテーブルが正確に作られました。

このrake db:migrateというコマンドは何をしているのかと言うと、 /db/migrateディレクトリに在るマイグレーションファイルの中から未実行のファイルを見つけて実行しているんです。 (こちらの記事に詳しく書いてます。参照→「Railsで使っているrakeについて」)

つまりマイグレーションファイルというのは、各々のファイルについて実行したかどうかを内部で全て管理されており、たった一度だけ実行されるようになっているものです。

マイグレーションファイルとスキーマファイルの関係


マイグレーションファイルが実行されたことよって、テーブルが作られたわけですが、それとは別に自動的に作成されたファイルがあります。/db/schema.rbです。

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

  create_table "users", force: :cascade do |t|
    t.string   "name"
    t.string   "age"
    t.string   "hometown"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end

このファイル(schema.rb)はスキーマファイルと呼ばれる、現在のデータベースの構造を記録したファイルです。

自分でモデル作成時に指定したname、age、hometownといったカラムだけでなく、 マイグレーションファイルのt.timestampsによって、created_atと、updated_atというタイムスタンプ用のカラムも作られているのが分かると思います。 ※idカラムに関してはスキーマファイルには表示されません。

実行ファイルであるマイグレーションファイルを実行したことによって、スキーマファイルが更新されたわけです。言わばスキーマファイルはマイグレーションファイルが実行された結果を表しています。

作成したモデルにカラムを追加したい時


もし後から、テーブルにカラムを1つ追加したいという場合などは、「usersテーブルに◯◯カラムを追加します」という指示を書いたマイグレーションファイルを作って実行することで、テーブル構造を変化させることができます。

新たなマイグレーションファイルを実行するたびに、データベースの構造が変化し、スキーマファイルは最新の状態に自動更新されることになります。

終わりに


rails だと自動生成とか良しなにやってくれるので、分かったつもりのところが多々ある気がするので、一つ一つ潰していこうと思います。 もし、間違っている点等があった場合はご教示いただけますと幸いです。