【Rails】migrateでのモデル生成などの手順

# 【１】はじめに

## 記事を作成した経緯
私は４月に進学した大学の課外活動で初めてプログラミング言語について学び始め、 Railsを使ってチーム開発をおこなっている。途中、 migrate をするにあたってステータスを ` down ` から ` up ` にする方法などをまとめて知ることができるページが存在しなかったため、作成を試みた。

## 目的
Railsに関する規則・構文について、自分と同じような悩みを持つ人が読みやすい資料として一括にまとめる。また各章末に、参考にした記事のURLを貼っておくので活用してほしい。

## お願い
本記事内では、私が「詰まった」あるいは「必要」だと感じた内容を記載しており、内容の一部は「項４．参考サイト」にある記事を参考にしている。また、本記事内に記載のない内容についても同じくリンクしてあるので、もし不明なことがあれば参考先を確認することで解決できる場合がある。

# 【２】Railsにおける命名規則
## 命名規則の重要性
Railsの**コントローラ**や**モデル**を ` rails generate ` あるいは ` rails g ` コマンドで生成する際に<font color="Red">それぞれ規則がある</font>ということを作成後に気が付いたため、特に注意したいところでもある。

## コントローラ

### 単一単語の場合
| 名称 | 例 |
|:-:|:-:|
| コントローラ名 | contents |
| コントローラクラス名 | ContentsController |
| ファイル名 | contents_controller.rb |

### 複数単語の場合
| 名称 | 例 |
|:-:|:-:|
| コントローラ名 | stamp_point |
| コントローラクラス名 | StampPointController |
| ファイル名 | stamp_point_controller.rb |

---

## モデル

### 単一単語の場合
| 名称 | 例 | 解説 |
|:-:|:-:|:-:|
| モデル名 | user |  |
| モデルクラス名 | User | 先頭大文字・単数形 |
| ファイル名 | user.rb | 先頭小文字・単数形 |
| テーブル名 | users | 先頭小文字・複数形 |


### 複数単語の場合

| 名称 | 例 | 解説 |
|:-:|:-:|:-:|
| モデル名 | cancel reason |   |
| モデルクラス名 | CancelReason | 先頭大文字・キャメル・単数形 |
| ファイル名 | cancel_reason.rb | 先頭小文字・スネーク・単数形 |
| テーブル名 | cancel_reasons | 先頭小文字・スネーク・複数形 |

### generation構文（例）

```
rails g model [model name] [column name]:[type] [column name]:[type] ...

例）
myapp# rails g model Task title:string finish:date detail:string owner:string member:string
      invoke  active_record
      create    db/migrate/20240925145024_create_tasks.rb
      create    app/models/task.rb
```

---

# 【３】マイグレートの実行・修正

## マイグレートを実行する
私は <b>`docker`</b> を利用しているため、 `docker compose exec rails bash` を実行することで rails コンテナの中に入って操作する。

この時、マイグレーションをする前には次のコードでマイグレートの状態を確認したほうがよい。
```
myapp# rails db:migrate:status
```


### 通常のマイグレート
**【パターン１】**
```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240925143128  Create users
  down    20240925143643  Create admin departments
```
**【パターン２】**
```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240925143128  Create users
  down    20240925143643  Create admin departments
  down    20240925144846  Create plans
  down    20240925145024  Create tasks
```
上記の **【パターン１】** や **【パターン２】** ですべてを `up` 状態にする場合、一般に以下のようにマイグレートする。
```
myapp# rails db:migrate
```
---
### マイグレーションファイルを限定する
**【パターン３】**
```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240925143128  Create users
  down    20240925143643  Create admin departments
  down    20240925144846  Create plans
  down    20240925145024  Create tasks
```
マイグレーションをする前にはマイグレートの状態を確認する必要がある。上記の **【パターン３】** において、特定のファイルを `up` 状態にする場合、一般に以下のようにマイグレートする。
```
myapp# rails db:migrate:up VERSION="[Migration ID]"

例）Create plans をマイグレートする場合
myapp# rails db:migrate:up VERSION="20240925144846"
```

## マイグレーションの削除
初めに、対象ファイルの状態を確認するため、以下のコマンドを実行。（参考：項「<font color="red">[マイグレートの実行](https://qiita.com/takumi1227/private/63a4dc67acfc3356914b#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B "本記事内に移動します")</font>」 )

```
myapp# rails db:migrate:status
```
すると、本ページの**パターン１**あるいは以下のようになっていると思われる。
```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240925143128  Create users
   up     20240925143643  Create admin departments
   up     20240925144846  Create plans
   up     20240925145024  Create tasks
```
基本的には個別にマイグレーションを ```down``` 状態にさせる。また、対象のファイルが ```down``` 状態になっていなければ以下のようにダウンさせる。
```
myapp# rails db:migrate:down VERSION=[Migrate ID]

例）Create plans をダウンさせる場合
myapp# rails db:migrate:down VERSION=20240925144846
```
もう一度状態を確認し、 ```down``` になっていれば最後に次のように削除する。
```
myapp# rm db/migrate/[対象のファイル名]

例）Create plans ファイルを削除する
myapp# rm db/migrate/20240925144846_create_plans.rb
```
また、ダウンさせる前に対象のファイルを削除した場合は、以下のページを参考にするとよい。

# 【４】参考サイト一覧

## 【Ⅰ】命名規則
- [データ型](https://qiita.com/gogonosmarty/items/6d6d770276f39326a2ce "MySQL で使える主なデータ型")
- [命名規則](https://qiita.com/gakkie/items/3afcd505c786364aa5fa "Rails における命名規則")
- [キャメル/スネークとは](https://qiita.com/am_nimitz3/items/7b01af53751dba5d8fb1 "変数名の命名規則")
- [モデル・コントローラの削除](https://qiita.com/s-yoshi210/items/8452c149e4751914697a)（本ページ内では紹介していませんが、リンク先ではモデルの生成から削除までの一連の流れが紹介されています。）

## 【Ⅱ】マイグレート

- [マイグレーションの削除](https://qiita.com/beanzou/items/e8886071ab1e1cf7a9c0#down%E3%81%95%E3%81%9B%E3%82%8B%E5%89%8D%E3%81%AB%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%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%8D "ダウンさせる前に...")
- [マイグレーションの修正](https://qiita.com/pyon_kiti_jp/items/a23660d20e76fffa5dd4 "修正して再実行")
- [ファイルのマイグレーション](https://qiita.com/murata0705/items/aa8455f46c8f5db26915 "特定のファイルのマイグレーション")

#記事第１号