【Rails】rails g (rails generate)とモデル、データベースについてまとめてみた

### 1.はじめに
railsでアプリを作成するときによく使用する（イメージがある）「rails g」コマンド。
今回はrails gコマンドについてまとめてみました。

### 2.使用環境
- mac.os バージョン10.15.6
- Ruby 2.6.6
- Rails 6.1.3.1
- psql (PostgreSQL) 12.6

### 3.rails gはどんな時に使う？
モデルやコントローラ、マイグレーションファイルなどを作成するとき。
`rails generate [対象の雛形] [引数]`とコマンドを入力すると作成できる。
※generate:生成するという意味。generateはgに省略可能。
今回は投稿型アプリで使用するPostモデルを作成しました。

```ruby
# string型のtitleとtext型のcontentの、2つのカラムを用意したPostモデルの作成
# rails g model [モデル名] [属性名：データ型 属性名：データ型 ...][オプション]
rails g model Post title:string content:text
```
#### 3.1.モデルとは
データとデータに関わるビジネスロジック（コアなルール。アプリケーション特有の処理）をオブジェクトとして実装したもの。また、データベースの保存や読み込みも行う。

#### 3.2.コントローラとは
ユーザーが操作するブラウザなどのクライアントからの入力（リクエスト）を受け、適切な出力（レスポンス）を作成するための制御を行う。必要に応じてモデルの利用やビューの呼び出しを行う。

#### 3.3.マイグレーションファイルとは
Rubyで書かれたテーブルの設計図。

`rails g model Post title:string content:text`を実行すると、2つのファイルが作成される。

①モデル

```app/models/post.rb
class Post < ApplicationRecord

end
```

②マイグレーションファイル

```②db/migrate/年月日時_create_posts.rb
class CreatePosts < ActiveRecord::Migration[6.1]
  def change
    create_table :posts do |t|
      t.string :title
      t.text :content
      # t.timestamps=>レコードが作成された時間(created_atカラム)と
      # 更新された時間(updated_atカラム)を作成してくれる
      t.timestamps 
    end
  end
end
```
マイグレーションファイルは`設計図`なので、この時点ではテーブルは作成されていない。
`rails db:migrate`コマンドを入力することでマイグレーションファイルが実行され、
データベースにテーブルが作成される。

Postテーブル ※テーブル:エクセルの表にあたる

| id | title | content | created_at | updated_at |
|:-:|:-:|:-:|:-:|:-:|
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |

`db/schema.rb`で、現在のテーブル一覧を確認することができる。
#### 3.4.db/schema.rbとは
現在のデータベースの構造を確認できる。schema.rbはマイグレーションを適用したり外したりすると自動的に出力される。

```db/schema.rb
ActiveRecord::Schema.define(version: 年月日時) do
  create_table "posts", force: :cascade do |t|
    t.string "title"
    t.text "content"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end  
end
```

#### 3.5.テーブルの作成はなぜ必要？
Railsのモデルクラスはデータベースのテーブルの定義を読み込んで動作するため。

#### 3.6.マイグレーションをやり直したい時の対策
マイグレーションの実行は一方通行になっており、マイグレーションファイルを修正して再度`rails db:migrate`しても更新されない。

- カラム名の追加・修正・削除をしたいとき：`rails g migration`コマンドでその指示を入れたマイグレーションファイルを作成する。
- `rails db:rollback (STEP=x)`（適用されているマイグレーションのバージョンからx個、マイグレーションする前の状態にする）, `rails db:migrate:down`（マイグレーションファイルのダウンメソッドを実行する）を活用する。

※`rails db:migrate:status`を実行すると現在の状況が確認できる。
upになっているものはすでに実行済みで、`rails db:rollback`や`rails db:migrate:down`にすることでmigrateする前の状態に戻りstatusがdownに変更される。`rails db:migrate`を行うと、再度upの状態に戻る。

```ruby
hogehoge@hogenoMacBook-Air app名 % rails db:migrate:status

database: app名_development
Status   Migration ID    Migration Name
--------------------------------------------------
   up     年月日時  　　　　Create posts
   up     年月日時  　　　　Create ◯○s
   up     年月日時  　　　　Create ◯○s
```

なお、master(main)ブランチやdevelopブランチにマージされた後、マイグレーションファイルを修正するのは他の開発者や本番環境に影響するため原則避ける。

### 4.調べてみて
コマンドを実行することでどのような影響を与えるか、より理解を深める必要があると感じた。

### 5.参考
1.書籍：大場寧子他, 現場で使えるRuby on Rails5速修実践ガイド, マイナビ出版, 2018.
2.web：[Railsにおけるマイグレーションとは](https://diveintocode.jp/blogs/Technology/migration)
3.web：[【Rails】マイグレーションファイルを徹底解説！](https://pikawaka.com/rails/migration)

### 6.最後に
記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。