Help us understand the problem. What is going on with this article?

Ruby on railsにおけるマイグレーションを初心者がひとつひとつ整理してみました。

More than 1 year has passed since last update.

はじめに

rails学習4か月目に突入しましたあやちか(@_ayk_study )です。
現在自作アプリを作成し始めて4か月たったのですが、アプリを作成する際に写経状態で進めていることからエラーが発生した時や自分でアレンジしたい時にサイトの仕組みが分かっていないので困ることが多いです。
そこで初心者なりにひとつひとつ丁寧に理解していこうと考えました。

今回はマイグレーションに関するエラーが出ているため、マイグレーションに関して学習しました。(恥ずかしながら今までマイグレーションについて時間とって学習していなかった:sweat_smile:

この投稿では主に
①Rubylife:初心者の方でもわかりやすいサイト
②小学生でもわかるRuby on Rails入門

を参考にまとめています。ご了承ください。
その他参考にしているサイトも随所で紹介しています。

いろいろなサイトからの情報をまとめたものなので、間違っている点などあったらご指摘ください。
では、はじめます:relaxed:

1 マイグレーションとは何か

辞書によるとマイグレーションとは移動、移住などの意味があります。
ではRuby on railsにおけるマイグレーションとは何を表すのか。

Ruby life:マイグレーション機能とはを参照すると、

通常テーブルを新規に作成するには必要なSQL文を直接実行して作成します。カラムを追加したりする場合も同じです。それに対してマイグレーションを使う場合はテーブルを新規に作成するためのマイグレーションスクリプトと呼ばれるスクリプトファイルを作成し実行します。後からカラムを追加したい場合には、カラムを追加するための別のスクリプトファイルを作成し実行します。

と記載されています。

上記に記載している「SQL」ですが、Railsを学ぶなら知っておきたいSQLについての基礎知識を参照すると、

SQLとは、リレーショナルデータベース(RDB:Relational Database)の管理や操作を行うための人工言語の一つ。業界標準として広く普及しており、様々なデータベース管理システム(DBMS:Databese Management System)で利用できる。
SQLとは-IT用語辞典 e-Wordsより

ひとことで言えば、DB(データベース)を扱うためのプログラミング言語とのこと。
とりあえず今は理解できそうにないので、そう覚えておきます。
なのでマイグレーションという機能があれば毎回毎回SQLを飛ばしてテーブルを作成することができる、ということだと思います。

しかし、これだけだとよくわかりません。

もう少し全体像をみてみるため、まずはマイグレーションがRuby on railsのアプリ開発における全体像のどの部分に関わってくるかについて整理したいと思います。
こちらのとてもわかりやすいサイトを参照→
Ruby life:RailsにおけるMVC(モデル/ビュー/コントローラ)
Buildinsider:コントローラの基本

Ruby on railsは、MVCアーキテクチャ構造になっています。
MVCアーキテクチャとは、アプリケーションをモデル(データを扱う部分)、ビュー(ユーザーに見える結果を作る部分)、コントローラ(ユーザーからの要求を処理し、モデルやビューと連携を行なう)に分割して作りあげるものです。というもので具体的には下の図のようなものです。

スクリーンショット (108).png

                    図1 MVCアーキテクチャのイメージ

コントローラーはモデルとのデータのやりとりを行っており、モデルはデータベースのやりとりを行っています。

まずマイグレーションの役割を理解する前にモデルの役割を理解したいと思います。

モデルとは

モデルとはなんでしょうか。最初の図1 MVCアーキテクチャのイメージにいったん戻ってみましょう。以下の部分をもう少し詳しく見てみます。

スクリーンショット (110).png

コントローラーとつながる部分にモデルがあります。

スクリーンショット (112).png

                      図2 MVCアーキテクチャ詳細

モデルとはデータベースとのやりとりを担当するところです。
railsドキュメント
によると、

データベースの情報を操作する仕組み

なるほど、わからん:v_tone1:
まず、データベースの情報とはなんぞや?

データベースとは

MVCアーキテクチャのモデルの下にあります。

小学生でもわかるRubyonrails:データベースが必要な理由から参照すると、

データベースは電話帳のようなもの。今まで個別にメモを取っていたものを一箇所にまとめてしまえば、全員の連絡先はその電話帳にすべて入っているので探す必要がなく、また探すときもアルファベット順に並べておけば、すぐに見つけることができるようになります。

データベースの役割は、「すべての情報をそこで一元管理することができる」ことと「見つけたい情報をすぐに見つけられるようにする」こと

と記述されています。
なるほど、データベースは同一の項をもつ様々な情報について一冊の本にまとめたものというイメージでしょうか。
なんとなくわかりました:sunny:

加えて同サイトより引用すると、例えば電話帳にどのような情報を記述するか(氏名、電話番号、備考欄等)を整理するにあたって「スキーマ」という枠があることがわかります。

大きな白いノートは保存しておきたい情報をすべてそこで管理するものになりました。Webアプリケーションのデータベースもそれと同じです。1万ページくらいある白いノートに当たるのが「データベース」、そこに最初に書き込む枠組みが「スキーマ」といいます。

これらよりスキーマという枠組みがあるということがわかりました。
また、ここでは「スキーマ=枠」と呼んでいますが、「スキーマ=枠」とは「テーブルの構造」のことを言います。
テーブルとは何か。次から次にわからないことがでてきますね:joy:
下にサンプルで電話帳テーブルの図を記載してみました!

スクリーンショット (114).png
         

ここでの電話番号や住所などの項を「カラム」といいます。

スキーマという枠を用意する際はひとつひとつの枠を書かく必要がありますが、マイグレーションファイルを利用するとその枠組みをが最初から用意することができます。これがマイグレーションの役割です。
イメージでいうと、枠のサンプルがありそれをコピペするイメージでしょうか。なので、後から枠を変更したいときに簡単に変更したりできます。

つまりマイグレーションとは「新規にデータベース上の枠を追加したいときに、枠を書くことなくRubyでデータベース内にテーブルを作成することができる機能」という機能ということがわかりました。
rails初心者がつまづきやすいマイグレーションより引用

では最初に戻ってここでのモデルとはなんでしょうか。
モデルとは具体的にいうと、さきほど引用文にあった「電話帳」の氏名、電話番号、住所等の情報をもっているひとかたまりをいいます。
この例の場合、「電話帳モデル」といいます。

では試しにモデルを生成してみましょう。ターミナルにおいて以下を実行。

$ rails g model user name:string username:string location:string about:text

※stringやtextについてはここでは詳しく説明しません。こちら「モデルの作成とRailsで指定可能なデータ型」をご参照ください。
これにより

app/models/user.rb
db/migrate/[timestamp]_create_users.rb

というファイルが生成されます。モデルの生成と同時にマイグレーションファイルが生成されます。
上はモデルファイル、下がマイグレーションファイルです。
[timestamp]というところには、その時の時間帯が表示されていると思います。

ファイルの中身を見てみます。

db/migrate/[timestamp]_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :username
      t.string :location
      t.text :about

      t.timestamps
    end
  end
end

このようになっており無事に枠が作成されています。
しかしマイグレーションはまだ完了していません。
ここでデータベースへのペーストにあたる作業を行います。ターミナルにおいて

$ rails db:migrate

これによりデータベース上にユーザーの枠がはじめて貼り付けられました。

以上、マイグレーション機能のまとめでした。
マイグレーションを理解するのにもそれだけではなくMVCアーキテクチャの全体像など知る必要があることがわかりました。
今までなんとなく写経してマイグレーションをしていましたが、自ら理解することでこれからの開発に役立ちそうです。

何か解説漏れや間違いなどがありましたらご指摘お待ちしております。

_ayk_study
趣味でプログラミングの勉強をしている26歳地方事務職員です。現在RubyonrailsとJavascriptとVue.jsを独学しています。簡単なポートフォリオサイトも作成しました。転職も視野に入れています。将来は、自分のスキルを使いながら、自分の力で稼げるようになりたいです。
https://ayakasportfolio.herokuapp.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした