rails コマンド まとめ (モデル コントローラー マイグレート)

# はじめに
ポートフォリオ作成に入って、コマンドのルールなんだったけ？
と忘れていることが多々あったので、よく使用するコマンドをアウトプットのためにまとめています！
都度追加予定です。

# アプリケーション作成
最初に必ず行うアプリケーション作成です
今回は「my_crop_plan」というアプリを作成していきます

```
$ rails new アプリケーション名
$ rails new my_crop_plan
```

# model作成
基本中の基本model作成です
今回は「Plan」という投稿用モデルを作成していきます

```
$ rails g model モデル名
$ rails g model Plan
```
この g は、generateの略です。生成という意味です

🌱modelの命名規則
英数字の単数形で指定し、先頭は大文字で記述するルールがあります
もし複数の単語を組み合わせる場合は、「PostPlan」などにしましょう

#### モデル作成時にカラムを追加する方法１
モデルを作成するときに一緒にカラムを追加できます！(migrateを忘れずに)
今回はRelationshipモデルを作成します
モデル名　カラム名:データ型↓
```
$ rails g model Relationship follower_id:integer followed_id:integer
$ rails db:migrate
```
#### モデル作成時にカラムを追加する方法２（外部キーの場合）
🌱中間テーブルを作成するときに便利なコマンドです！

```
$ rails g model PlanTag plan:references tag:references
$ rails db:migrate
```

:::note info
referencesとは（直訳：参照、参考)
名前の通り、作成済みのテーブルを参照する場合に使用します
コマンドを実行すると下記カラムがマイグレーションファイルに自動追加されます
```
t.references :plan, null: false, foreign_key: true
t.references :tag, null: false, foreign_key: true
```
後からマイグレーションファイルに追加することも可能！
アソシエーションの「belongs_to」を自動追記
※「has_many」は追加してくれないので注意⚠️
:::

参考URL：https://prograshi.com/framework/rails/references_and_foreign-key/

# model削除
誤って作成したmodelを削除します
今回は先ほど作成した「Plan」モデルを削除していきます

```
$ rails d model モデル名
$ rails d model Plan
```

# controller作成
同じく基本のcontroller作成です
先ほどの「Plan」モデルの「plans」のコントローラーを作成します
３パターン記載していきます

#### 通常のcontroller作成

```
$ rails g controller コントローラー名
$ rails g controller plans
```

#### controller作成 + ルーティング・ビューを同時に作成

```
$ rails g controller plans new index show
```

自動作成される↓
```plans_controller.rb
class PlansController < ApplicationController
  def new
  end

  def index
  end

  def show
  end
end
```

```routes.rb
Rails.application.routes.draw do
  get 'plans/new'
  get 'plans/index'
  get 'plans/show'
end
```

```index.html.erb
<h1>Public::Plans#index</h1>
<p>Find me in app/views/public/plans/index.html.erb</p>
```

#### controller作成 + ルーティング・ビューを同時に作成 + 保存場所をpublicフォルダに指定

```
$ rails g controller public/plans new index show
```
publicファイルに全て作成されたりルーティングされたりします！
不要なものを自分で削除したり修正しましょう！

🌱controllerの命名規則
複数形かつ全て小文字で書くのがルールです
もし複数の単語を組み合わせる場合は、「post_plans」などにしましょう

# migration
マイグレーションファイルを修正したい！
って時に使用するコマンドを紹介します！

#### ステータス確認
rails db:migrate:statusをすると現在のステータスを確認できます
MigrationIDなどあとで使用する情報もここに含まれています！

```
$ rails db:migrate:status

Running via Spring preloader in process 13765

database: db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240601103957  Devise create users
   up     20240602043254  Create plans
   up     20240608084410  Create comments
   up     20240608115131  Create likes
   up     20240611072708  Create relationships
   up     20240613025152  Create rooms
   up     20240613025320  Create chats
   up     20240613025358  Create user rooms
```

#### リセット
まだ何もデータがない時ならresetをすることでマイグレーションファイルをschema.rbに反映できます！既にデータを保存している場合は、消えてしまうのでそれでもよかったらリセットしましょう！
例）既に会員登録をしてユーザーが存在している、投稿している
→ ユーザーが全て消えます！、投稿データも消えます！

```
$ rails db:migrate:reset
```

#### ロールバック1
直近に作成した１つのマイグレーションファイルをdownにすることができます！
```
$ rails db:rollback
```
ステータスを確認してみると↓
```
$ rails db:migrate:status

Running via Spring preloader in process 18072

database: db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240601103957  Devise create users
   up     20240602043254  Create plans
   up     20240608084410  Create comments
   up     20240608115131  Create likes
   up     20240611072708  Create relationships
   up     20240613025152  Create rooms
   up     20240613025320  Create chats
  down    20240613025358  Create user rooms
```

一番下のuser roomsがdownになりました！
この状態でマイグレーションファイルを修正し、rails db:migrateを実行すると、user roomsの変更点がschema.rbに反映されてステータスがupに戻るはずです！

:::note alert
マイグレーションファイルの修正をデータベースに反映させるには、一度ステータスをdownにしてからrails db:migrateを実行する必要があります！
migrateしたら反映されているかschema.rbを確認するようにしましょう！
:::

#### ロールバック2
直近の３つのファイルをdownに変更するコマンド

```
$ rails db:rollback STEP=3
```
```
$ rails db:migrate:status

Running via Spring preloader in process 19522

database: db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240601103957  Devise create users
   up     20240602043254  Create plans
   up     20240608084410  Create comments
   up     20240608115131  Create likes
   up     20240611072708  Create relationships
  down    20240613025152  Create rooms
  down    20240613025320  Create chats
  down    20240613025358  Create user rooms
```

#### ロールバック3
指定のマイグレーションファイルをdownにするコマンド
```
$ rails db:migrate:down VERSION=該当のMigrationID
```
例）chatsのファイルだけを修正したい場合
```
$ rails db:migrate:down VERSION=20240613025320
```
```
$ rails db:migrate:status

Running via Spring preloader in process 19522

database: db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240601103957  Devise create users
   up     20240602043254  Create plans
   up     20240608084410  Create comments
   up     20240608115131  Create likes
   up     20240611072708  Create relationships
   up     20240613025152  Create rooms
  down    20240613025320  Create chats
   up     20240613025358  Create user rooms
```

あとは修正したいファイルを修正して、rails db:migrateするだけです！

# grepコマンド省略形
ルーティングを確認するのに、今までgrepで絞り込んでいましたが
省略形を教えていただきました！！！
打ちやすい！！！

```
$ rails routes | grep user
```
↓
```
$ rails routes -g user
```

# RSpecテスト実行コマンド
#### 全てのテストを走らせる
```
$ bundle exec rspec spec/ --format documentation
```

#### ファイルを指定してテストを走らせる
今回はsystemの中のplans_spec.rbのみ走らせる
```
$ bundle exec rspec spec/system/plans_spec.rb  --format documentation
```

#### ファイルを指定かつ行数を指定してテストを走らせる
今回は先ほどのファイルの156行目から一連のテストを走らせる
```
$ bundle exec rspec spec/system/plans_spec.rb:156  --format documentation
```

# さいごに
メモがてら都度追加予定です！