Railsで当たり前のように使っているrails db:migrateですが実は何となく使っていて実際に何をしているか分かっていない方もいらっしゃるのではないでしょうか?
自分もつい最近までは何となく、あーmigrationファイルをデータベースに反映してるのね~程度にしか理解していませんでした。
しかし深くまで勉強し行くうちに、「あれ、結局Railsのそれぞれのコマンドって何をしてるんだろう」と思ったので今回記事にまとめました。
migrateはmigrationファイルの内容をDBに反映する行為
結論から言うと
migrateはmigrationファイルの内容をDBに反映する行為
になります。
しかしこれだけでは弱いのでのでもう少し深堀していこうと思います。
MVCモデルについて
まずは基礎認識の部分ですが、Ruby on RailsはというフレームワークはMVCというモデルを使用しております。
ここでは詳細を省かせていただきますが、
- サーバーからのリクエストに応じてアクションを実行するController
- データベース(DB)とのやり取りを行うModel
rails g model
- ブラウザ表示を担うView
という3つの部分から構成されます。
rails g model
migration(マイグレーション)を理解する前にまずはモデルの作成コマンドから紐解いていきましょう。
rails g modelコマンドを実行すると大きく分けてmodelファイルとmigrationファイルの2種類が作成されます(厳密にいうとさらにtestファイルなども自動作成されます)。
これらのファイルはそれぞれ
- migrationファイル→DBに変更を加える内容
- modelファイル→DBとRailsのアプリケーションを繋ぐ
といった役割があります。
特にここで作成されるモデルは全てApplicationRecordというクラスを継承しております。
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
end
さらにこのApplicationRecordクラスの親クラスはActiveRecord::Baseを継承しています。
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
このActiveRecordクラスはDBとやり取りする際に必要なSQL構文を翻訳する機能を持っています。
そのためいちいちSQL構文を書かずとも簡単にDBにアクセスしデータをいじくることができるのです。
Railsから入るとあまりなじみがないかもしれませんが、通常DBにアクセスしデータを操作するためにはSQLという別の言語を使って指示を飛ばさなくてはなりません。
-- テーブルを作成
CREATE TABLE USERS (
ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR NOT NULL
AGE INT NOT NULL
);
-- データを作成(railsではtable.create(value1, value2…))
INSERT INTO USERS VALUES (1,'イチハラ','');
-- データをすべて選択(railsではmodel.all)
SELECT * FROM USERS
しかしRailsではこのActiveRecordを使用することで自動でSQLに翻訳し、より直感的で簡単な構文でDBを操作することができるのです。
またこのActiveRecord::Baseクラスでは自動的にゲッターとセッターが定義されているため、意図的にattr_accessorなどを定義せずともインスタンスの値を参照することができます。
なるほど…
確かに便利だけどこれがゲッターとセッターを理解するのに苦しんだ訳か…
rails db:migrate
rails db:migrateを実行すると作成されたmigrationファイルを基にDBに変更を加えます。今回の場合はmodel作成時のmigrateの為、DB上に新たにテーブルを作成します。
class CreateUsers < ActiveRecord::Migration[5.1]
def change
create_table :users do |t|
t.string :name
t.timestamps
end
end
end
ActiveRecordによって作成されたテーブルは以下のような特徴を持ちます。
- テーブル名はmodelの複数形(Post → posts)
- id,created_atが自動作成
ちなみにrails g migrationによってmigrationファイルを作成した場合は自動的にchangeメソッドが定義されており、すでに作成されたテーブルに変更を加えることができます。
class PasswordDigestToUsers < ActiveRecord::Migration[5.1]
def change
add_column :users, :password_digest, :string
end
end
終わり
以上がマイグレーションについてです。
あまり自信があるわけではないので、間違っていた李解説がおかしい部分があればご指摘いただけると幸いです!