40
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

結局【rails db:migrate】は何をやっているのか?

Posted at

Railsで当たり前のように使っているrails db:migrateですが実は何となく使っていて実際に何をしているか分かっていない方もいらっしゃるのではないでしょうか?

自分もつい最近までは何となく、あーmigrationファイルをデータベースに反映してるのね~程度にしか理解していませんでした。

しかし深くまで勉強し行くうちに、「あれ、結局Railsのそれぞれのコマンドって何をしてるんだろう」と思ったので今回記事にまとめました。

migrateはmigrationファイルの内容をDBに反映する行為

結論から言うと
migrateはmigrationファイルの内容をDBに反映する行為
になります。

しかしこれだけでは弱いのでのでもう少し深堀していこうと思います。

MVCモデルについて

まずは基礎認識の部分ですが、Ruby on RailsはというフレームワークはMVCというモデルを使用しております。

Untitled Diagram.jpg

ここでは詳細を省かせていただきますが、

  • サーバーからのリクエストに応じてアクションを実行するController
  • データベース(DB)とのやり取りを行うModel

rails g model

  • ブラウザ表示を担うView

という3つの部分から構成されます。

rails g model

migration(マイグレーション)を理解する前にまずはモデルの作成コマンドから紐解いていきましょう。

rails g modelコマンドを実行すると大きく分けてmodelファイルとmigrationファイルの2種類が作成されます(厳密にいうとさらにtestファイルなども自動作成されます)。

これらのファイルはそれぞれ

  • migrationファイル→DBに変更を加える内容
  • modelファイル→DBとRailsのアプリケーションを繋ぐ

といった役割があります。

Untitled Diagram.3png.png

特にここで作成されるモデルは全てApplicationRecordというクラスを継承しております。

models/user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
end

さらにこのApplicationRecordクラスの親クラスはActiveRecord::Baseを継承しています。

models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

このActiveRecordクラスはDBとやり取りする際に必要なSQL構文を翻訳する機能を持っています。

そのためいちいちSQL構文を書かずとも簡単にDBにアクセスしデータをいじくることができるのです。

Railsから入るとあまりなじみがないかもしれませんが、通常DBにアクセスしデータを操作するためにはSQLという別の言語を使って指示を飛ばさなくてはなりません

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上に新たにテーブルを作成します。

xxxxxxxx_create_users.rb
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メソッドが定義されており、すでに作成されたテーブルに変更を加えることができます。

xxxxxxxx_oooo.rb
class PasswordDigestToUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :password_digest, :string
  end
end

終わり

以上がマイグレーションについてです。

あまり自信があるわけではないので、間違っていた李解説がおかしい部分があればご指摘いただけると幸いです!

40
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?