【Rails】マイグレーションコマンドまとめ

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# マイグレーションコマンドの書き方

`$ rails g migration ChangeColumnToBooks` は、
`$ rails generation migration change_column_to_books` と書くのと同じ。

つまり、`generation`は`g`と略す事ができ、
`AddBodyToBooks`の様に、単語の先頭を大文字にする事で「 _ 」を書く手間が省ける。

# 基本コマンド

### 1.モデルとテーブルを作成

`$ rails g model モデル名 カラム名:型名`

```terminal:ターミナル
$ rails g model Book title:string
```

```ruby:migrate/~_create_books.rb
class CreateBooks < ActiveRecord::Migration[5.2]
  def change
    create_table :books do |t|
      t.string :title

      t.timestamps
    end
  end
end
```

### 2.モデルとテーブルを削除

`rails d model モデル名`

```terminal:ターミナル
$ rails d model Book
```

### 3.マイグレーションを実行

```terminal:ターミナル
$ rails db:migrate
```

### 4.マイグレーションの内容を戻す

**①１ステップ前に戻る場合**

```terminal:ターミナル
$ rails db:rollback
```

**①複数ステップ前に戻る場合**

```terminal:ターミナル
$ rails db:rollback STEP=5 # 数字は自由に変更可能
```

### 4.マイグレーションのステータス確認

```terminal:ターミナル
rails db:migrate:status
```

# テーブル関係

### 1.テーブルのみを削除

`$ rails g migration Dropテーブル名`

```terminal:ターミナル
$ rails g migration DropBooks
```

```ruby:migrate/~_drop_books.rb
class DropBooks < ActiveRecord::Migration[5.2]
  def change
    drop_table :books # 追記
  end
end
```

### 2.テーブル名を変更

`$ rails g migration Rename変更前のテーブル名To変更後のテーブル名`

```terminal:ターミナル
$ rails g migration RenameBooksToArticles
```

```ruby:migrate/~_rename_books_to_articles.rb
class RenameBooksToArticles < ActiveRecord::Migration[5.2]
  def change
    rename_table :books, :articles # 追記
  end
end
```

# カラム関係

### 1.カラムを追加

**①単体**

`$ rails g migration Addカラム名Toテーブル名 カラム名:型名`

```terminal:ターミナル
$ rails g migration AddBodyToBooks body:text
```

```ruby:migrate/~_add_body_to_books.rb
class AddBodyToBooks < ActiveRecord::Migration[5.2]
  def change
    add_column :books, :body, :text
  end
end
```

**②複数**

`$ rails g migration AddColumnsToテーブル名 カラム名:型名 カラム名:型名 カラム名:型名`

```terminal:ターミナル
$ rails g migration AddColumnsToBooks body:text introduction:text price:integer
```

```ruby:migrate/~_add_columns_to_books.rb
class AddColumnsToBooks < ActiveRecord::Migration[5.2]
  def change
    add_column :books, :body, :text
    add_column :books, :introduction, :text
    add_column :books, :price, :integer
  end
end
```

### 2.カラムを削除

**①単体**

`$ rails g migration Removeカラム名Fromテーブル名 カラム名:型名`

```terminal:ターミナル
$ rails g migration RemoveTitleFromBooks title:string
```

```ruby:migrate/~_remove_title_from_books.rb
class RemoveTitleFromBooks < ActiveRecord::Migration[5.2]
  def change
    remove_column :books, :title, :string
  end
end
```

**②複数**

`$ rails g migration RemoveColumnsFromテーブル名 カラム名:型名 カラム名:型名 カラム名:型名`

```terminal:ターミナル
$ rails g migration RemoveColumnsFromBooks body:text introduction:text price:integer
```

```ruby:migrate/~_remove_columns_from_books.rb
class RemoveColumnsFromBooks < ActiveRecord::Migration[5.2]
  def change
    remove_column :books, :body, :text
    remove_column :books, :introduction, :text
    remove_column :books, :price, :integer
  end
end
```

### 3.カラムのデータ型を変更

`$ rails g migration ChangeDataカラム名Toテーブル名 カラム名:型名`

```terminal:ターミナル
$ rails g migration ChangeDataTitleToBooks
```

```ruby:migrate/~_change_data_title_to_books.rb
class ChangeDataTitleToBooks < ActiveRecord::Migration[5.2]
  def change
    change_column :books, :title, :text # 追記
  end
end
```

### 4.カラムのオプションを追加

`$ rails g migration ChangeOptionカラム名Toテーブル名 カラム名:型名`

```terminal:ターミナル
$ rails g migration ChangeOptionTitleToBooks
```

```ruby:migrate/~_change_option_title_to_books.rb
class ChangeOptionTitleToBook < ActiveRecord::Migration[5.2]
  def change
    change_column :books, :title, :string, null: false # 追記
  end
end
```

### 5.データ型一覧

|型名|役割|
|---|---|
|string|短い文字列|
|text|長い文字列|
|integer|整数|
|float|浮動少数|
|decimal|精度の高い少数|
|datetime|日時|
|timestamp|タイムスタンプ|
|time|時間|
|date|日付|
|binary|バイナリ文字列|
|boolean|真偽値|

### 6.よく使うオプション

|オプション名|役割|
|---|---|
|default|初期値を設定|
|null|空欄の真偽|
|limit|長さを制限|
|unique|一意制約を付与|
|unique|インデックスを付与|