Migrationファイルを操作する

Ruby On RailsのMigrationファイルの操作についてまとめ。
すぐ忘れるので。

## Migration　ファイルを追加
### モデル作成
```ruby:ターミナル
# モデルを作成
rails g model User name:string introduction:string
```
```ruby:db/migrate/XXX_create_users.rb(XXXは作成日時)
class CreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|
      t.string :name
      t.string :introduction

      t.timestamps
    end
  end
end
```
```ruby:db/schema.rb
ActiveRecord::Schema.define(version: 2021_07_15_224955) do
  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "introduction"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end
end
```
### Addカラム
```ruby:ターミナル
# モデルにカラムを追加
rails g migration AddAgeToUsers age:integer
```
```ruby:db/migrate/XXX_add_age_to_users.rb(XXXは作成日時)
class AddAgeToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :age, :integer
  end
end
```
```ruby:db/schema.rb
ActiveRecord::Schema.define(version: 2021_07_15_225334) do
  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "introduction"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.integer "age"
  end
end
```
### カラム削除
```ruby:ターミナル
# モデルからカラムを削除
rails g migration RemoveIntroductionFromUsers introduction:string
```
```ruby:db/migrate/XXX_remove_introduction_from_users.rb(XXXは作成日時)
# removeの時はupとdownを設定しておくとrollbackしやすい
class RemoveIntroductionFromUsers < ActiveRecord::Migration[6.1]
  def up
    remove_column :users, :introduction
  end

  def down
    add_column :users, :introduction, :string
  end
end
```
```ruby:db/schema.rb
ActiveRecord::Schema.define(version: 2021_07_15_225514) do
  create_table "users", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.integer "age"
  end
end
```
### カラム修正
```ruby:ターミナル
# モデルからカラムを削除
rails g migration rename_name_column_to_Users
```
```ruby:db/migrate/XXX_remove_introduction_from_users.rb(XXXは作成日時)
# Userモデルのnameカラムをfirst_nameカラムに変更
class RenameNameColumnToUsers < ActiveRecord::Migration[6.1]
  def change
    rename_column :Users, :name, :first_name
  end
end
```

|code|string|integer|float|datetime|time|date|boolean|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|データ型|文字列|整数|浮動小数|日時|時間|日付|Boolean|

## Migration　ファイルの修正
```ruby:ターミナル
# ステータスを確認
rails db:migrate:status

# downさせる
rails db:migrate:down VERSION=20200504051127

# down状態にしてから、マイグレーションを修正する

# 再度upさせる
$ rails db:migrate:up VERSION=20200504051127
```

## Migration　ファイルの削除
```ruby:ターミナル
# マイグレーションファイルの状態を確認
rails db:migrate:status

# 削除するときはstatusをdownにする
rails db:migrate:down VERSION=Migration ID

# 削除する
rm db/migrate/20210323030224_hoge.rb
```

## NO FILEのMigration　ファイルの削除
```ruby:ターミナル
# NO FILEのままupされているので、適当な名前で再度作り直してから削除する
touch db/migrate/20210323030224_hoge.rb
```
ファイルの中身を記述する

```ruby:20210323030224_hoge.rb
class Hoge < ActiveRecord::Migration[5.0]
  def change
  end
end
```
```ruby:ターミナル
# migrationファイルを適応する
rails db:migrate

# downする
rails db:migrate:down VERSION=20210323030224_Hoge.rb

# 削除する
rm db/migrate/20210323030224_hoge.rb
```

## 参考資料
[rails generate migrationコマンドまとめ](https://qiita.com/zaru/items/cde2c46b6126867a1a64)
[【Rails】 マイグレーションファイルを徹底解説！](https://pikawaka.com/rails/migration)
[新しいマイグレーションを追加してテーブルを変更](https://www.javadrive.jp/rails/model/index7.html)
[Ruby on Rails カラムの追加と削除](https://qiita.com/azusanakano/items/a2847e4e582b9a627e3a)
[【Rails】migrationのchangeとup/downって何が違うの？](https://tanihiro.hatenablog.com/entry/2014/01/10/182122)
[Rails カラム名変更方法](https://qiita.com/libertyu/items/93acd8733e34b1d0a63c)
[Railsで過去履歴のmigrationを修正して再実行する](https://qiita.com/pyon_kiti_jp/items/a23660d20e76fffa5dd4)
[【Rails】マイグレーションファイルの削除](https://qiita.com/ISSO33/items/33a935cb3255c269bef2)