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


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

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

この投稿では主に
[①Rubylife:初心者の方でもわかりやすいサイト](https://www.rubylife.jp/)
[②小学生でもわかるRuby on Rails入門](https://openbook4.me/projects/92)

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

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


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

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

[Ruby life:マイグレーション機能とは](https://www.rubylife.jp/rails/model/index5.html)を参照すると、

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

と記載されています。

上記に記載している「SQL」ですが、[Railsを学ぶなら知っておきたいSQLについての基礎知識](https://www.yuta-u.com/programing/sql-basic-knowledge)を参照すると、

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

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

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


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

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

![スクリーンショット (108).png](https://qiita-image-store.s3.amazonaws.com/0/256858/1f86c949-705a-ea96-ab64-1d633c2205ae.png)


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


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

まずマイグレーションの役割を理解する前にモデルの役割を理解したいと思います。
###モデルとは
モデルとはなんでしょうか。最初の図１　MVCアーキテクチャのイメージにいったん戻ってみましょう。以下の部分をもう少し詳しく見てみます。

![スクリーンショット (110).png](https://qiita-image-store.s3.amazonaws.com/0/256858/6f2154ab-d6f9-5385-ba34-9e2ac3b0d6e5.png)





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


![スクリーンショット (112).png](https://qiita-image-store.s3.amazonaws.com/0/256858/8ddc0f8c-2bd5-4d13-97bb-87e583c87708.png)

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



モデルとはデータベースとのやりとりを担当するところです。
[railsドキュメント](http://railsdoc.com/model)
によると、
>データベースの情報を操作する仕組み

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

###データベースとは

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


[小学生でもわかるRubyonrails:データベースが必要な理由](https://openbook4.me/projects/92/sections/493)から参照すると、

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

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

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

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

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

![スクリーンショット (114).png](https://qiita-image-store.s3.amazonaws.com/0/256858/8b6530ab-e45c-bc75-5871-82c0c93f38a5.png)
　　　　　　　　　


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

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












**つまりマイグレーションとは「新規にデータベース上の枠を追加したいときに、枠を書くことなくRubyでデータベース内にテーブルを作成することができる機能」という機能ということがわかりました。**
※[rails初心者がつまづきやすいマイグレーション](https://www.transnet.ne.jp/2015/12/29/rails%E5%88%9D%E5%BF%83%E8%80%85%E3%81%8C%E3%81%A4%E3%81%BE%E3%81%9A%E3%81%8D%E3%82%84%E3%81%99%E3%81%84%E3%80%8C%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%8Dcolnr/)より引用


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

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

```
$ rails g model user name:string username:string location:string about:text
```
※stringやtextについてはここでは詳しく説明しません。[こちら「モデルの作成とRailsで指定可能なデータ型」](https://www.javadrive.jp/rails/model/index4.html)をご参照ください。
これにより

>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アーキテクチャの全体像など知る必要があることがわかりました。
今までなんとなく写経してマイグレーションをしていましたが、自ら理解することでこれからの開発に役立ちそうです。

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