[Rails]マイグレーションファイルのすすめ。

<br>
##初めに
現在サーバーサイドエンジニアを目指してフロントエンドにVue.js、バックエンドにRailsを使ったポートフォリオを作成中なのですが、ふとあることに気がつきました。
###マイグレーションファイルのことそんな知らんやん。
今まで、```rails g migration AddCulmnToテーブル名```でマイグレーションファイルを生成する。
生成したファイルに対して、型やlimitなどのオプションを付けて```rails db:migrate```でデータベースに反映させる。その程度の理解でした。しかし実際にコードを書いていると、リファレンス？インデックス？楽観的ロック？？など聞いたことはあるが、理解が曖昧な単語が増えてきたのでこの記事を通して整理します。もし同じような方がおらられば、参考にしていただければ幸いです。

なおこの記事では以下の記事を参考にさせていただいております。

[Pikawaka マイグレーションファイルを徹底解説！](https://pikawaka.com/rails/migration)
[Railsガイド](https://railsguides.jp/active_record_querying.html)


<br>
##マイグレーションファイル
###マイグレーションファイルとは
railsでデーターベースに何らかの変更をする際に作成する。具体的な変更内容を記述して読み込ませることで、変更をデータベースに反映させるためのファイル。

```
#コマンド
rails g migratin Add追加するカラム名To追加するテーブル名 追加するカラム名:型   #マイグレーションファイルを作成
rails db:migrate  #編集したマイグレーションファイルを読み込み反映させる。
rails db:rollback #最新のマイグレーションをキャンセルする。二回行うと次に新しいマイグレーションがキャンセルされる。

#modelを作成すると自動で作成される。
rails g model モデル名　#デフォルトでマイグレーションファイルも作成されている。
```
※マイグレーションファイルの名前は、どんな名前でも問題はないが上記の書式で生成することによって、最初からコードが書かれた状態で生成される。


<br>
###マイグレーションファイル例
```
class CreateEmployees < ActiveRecord::Migration[6.1]
  def change　　　　　　　　　　　　　　　　　　　　　　　
    create_table :employees do |t|　　　　　　　　　　＃メソッド名
      t.string :name　　　　　　　　　　　　　　　　　　 #t.カラム型　：カラム名
      t.string :department, null: false            #t.カラム型　：カラム名, オプション
      t.integer :gender, null: false, default: 0　　#t.カラム型　：カラム名, オプション1, オプション2 
      t.timestamps                                 #タイムスタンプです。
      t.integer :lock_version, default: 0　　　　　　#楽観的ロックを実装するためのカラムが追加される。
    end
  end
end
```
ある程度railsを触られたことがある方なら、書き方は問題ないと思います。今回は書き方は省略してカラム型やオプションの種類、その他の基礎について触れます。


###メソッドの種類

上記のマイグレーションファイルではcreate_tableメソッドを使用していますが、その他多くのメソッドが用意されています。

|メソッド|	用途|
|---|---|---|
|add_column	|カラムを追加する
|remove_column	|カラムを削除する
|remove_columns	|複数のカラムを削除する
|rename_column	|カラムの名前を変更する
|change_column	|カラムの情報を変更する
|create_table	|テーブルを作成する
|drop_table	|テーブルを削除する
|rename_table	|テーブル名を変更する
|add_index	|インデックスを追加する
|remove_index	|インデックスを削除する
|add_reference	|外部キーを作成する
|remove_reference	|外部キーを削除する
|add_foreign_key	|外部キー制約を作成する
|remove_foreign_key	|外部キー制約を削除する
<br>
###カラムの種類
カラムには、使用用途別に多くのカラムが用意されています。

|　型 |　説明  |　要素　  |
|---|---|---|
|string|	文字（255文字まで）|	名前やメールアドレスなど短い文字
|text  |	長い文章|	ブログの記事や投稿される内容
|integer|	整数（4byte）|	通常使用する範囲の整数で保存したいとき
|smallint|	整数（2byte）|	狭範囲の整数で保存するとき
|bigint	|整数（8byte）|	かなり大きな整数で保存する可能性があるとき
|float	|浮動小数点数|	小数点を含めた数値を保存したいとき
|decimal|
|numeric|	固定長整数|	桁の大きな数を桁数などを指定して保存したいとき
|※decimal|型とnumeric型の違いはほぼなし
|boolean|	真か偽か|	trueかfalseで保存したいとき
|time	|時刻型|	時刻を「12:00:00」の形で保存したいとき
|date	|日付型|	日付を「2001-01-01」の形で保存したいとき
|datetime|	日時型|	日時を「2001-01-01 01:01:00」の形で保存したいとき
|json	|json型|	JSONとして保存したいとき
|binary	|バイナリ文字列型|	画像ファイルなどバイナリデータとして保存したいとき
|references|	外部キーの定義|	外部キーを追加したいとき　※本記事内で解説しています
<br>

###マイグレーションファイルを削除する際の注意点
引用:Pikawaka マイグレーションファイルを徹底解説！
>マイグレーションファイルはいわばデータベースを作成した歴史です。
ですので実行されてup状態になっているマイグレーションファイルは絶対に削除したり編集したりしてはいけません。
もし誤ってup状態のマイグレーションファイルを削除してしまった状態でアプリをサーバーにアップした時、エラーが出てしまうためです。
サーバーにアップされたマイグレーションファイルは最初は全てdown状態になっています。
それをrails db:migrateコマンドで実行するのですが、例えばusersテーブルを作成するマイグレーションファイルを削除してしまって、その後にusersテーブルにカラムを追加するマイグレーションファイルがあった時どうなるでしょう？
そうですね、存在しないusersテーブルにカラムを追加することはできないのでエラーが出てしまいます。
ローカルだとすでにusersテーブルは削除してしまったマイグレーションファイルによって作成されているため、エラーが出なかったわけです。
このようなことが起こりえるため、マイグレーションファイルを削除する際は必ずdown状態になっているのを確認してから削除するようにしましょう。

```rails db:migrate```されたマイグレーションファイルのステータスはupになっています。もしファイルを削除したい場合は、上記の通りステータスをdownにする必要があります。
なので以下のようにしっかりと確認してから削除する必要があります。

```
rails db:rollback       #最新のマイグレーションをrollback(downに変更)
rails db:migrate:status #マイグレーションのステータスを確認する。downであれば削除OK
```

##最後に
今回はindexや楽観的ロック、リファレンスまでまとめるつもりでしたが、予想以上に長くなりそうのなので次回に続きます!
ご覧いただきありがとうございました。