指定したマイグレーションファイルをrollbackする方法

# はじめに

オリジナルアプリ製作中にマイグレーションファイルの修正が必要になりrollbackの仕方について調べました。
自分なりにまとめたいと思います。

## rollbackの手順

まずは現在どこまでmigrateされているかの確認をします。

ターミナル

    $ rails db:migrate:status

    database: bouldering_development

    Status   Migration ID    Migration Name
    --------------------------------------------------
       up     20210723073418  Devise create users
       up     20210726075554  Create problems
       up     20210726100515  Create active storage tablesactive storage
       up     20210805065731  Create comments
       up     20210806065531  Create likes

こんな感じで出てきます。
一番下に表示されているのが最新のマイグレーションファイルです。

statusのところが`up`になっていとmigrateされているということになります。

されていない場合は`down`と表示されます。

ここでは全て`up`になっているので全てマイグレーションが実行されているということになります。

## 最新の一つのファイルだけrollbackする方法

最新のファイル　likesだけrollbackしたい時は`rails db:rollback`のコマンドを入力

ターミナル

    $ rails db：rollback

    == 20210806065531 CreateLikes: reverting ======================================
    -- drop_table(:likes)
       -> 0.0064s
    == 20210806065531 CreateLikes: reverted (0.0084s) =============================

こんな感じの表示が出てきたrollback完了です。
`rails db:migrate:status`で確認してみましょう。

ターミナル

    $ rails db:migrate:status

    Status   Migration ID    Migration Name
    --------------------------------------------------
       up     20210723073418  Devise create users
       up     20210726075554  Create problems
       up     20210726100515  Create active storage tablesactive storage
       up     20210805065731  Create comments
      down    20210806065531  Create likes

likesのstatusが`down`になっているのでrollback成功です。

ちなみにこの状態でもう一度`rails db：rollback`のコマンド入力して確認すると

    % rails db:migrate:status

    database: bouldering_development

    Status   Migration ID    Migration Name
    --------------------------------------------------
    up     20210723073418  Devise create users
    up     20210726075554  Create problems
    up     20210726100515  Create active storage tablesactive storage
    down    20210805065731  Create comments
    down    20210806065531  Create likes

二番目に新しいcommentsがrollbackされます。

## 指定したところまでrollbackする方法

では、次に指定したところまでrollbackする方法について書いていきます。

その前に一度commentsとlikesをmigrateされた状態に戻します。

ターミナル

    $ rails db:migrate
      
    == 20210805065731 CreateComments: migrating ===================================
    -- create_table(:comments)
       -> 0.0336s
    == 20210805065731 CreateComments: migrated (0.0337s) ==========================

    == 20210806065531 CreateLikes: migrating ======================================
    -- create_table(:likes)
       -> 0.0301s
    == 20210806065531 CreateLikes: migrated (0.0302s) =============================

     $ rails db:migrate:status

    database: bouldering_development

     Status   Migration ID    Migration Name
    --------------------------------------------------
       up     20210723073418  Devise create users
       up     20210726075554  Create problems
       up     20210726100515  Create active storage tablesactive storage
       up     20210805065731  Create comments
       up     20210806065531  Create likes

`rails db:rollback`では一つずつしかrollbackされなかったが`rails db:migrate`では`down`になっている全てのファイルがmigrateされるので覚えとくべきですね。

commentsとlikesが`up`に戻ったので
指定したところまでrollbackする方法に戻ります。

今回、problemsまでのファイルをrollbackさせたいとします。

その場合は`rails db:rollback STEP=4`と入力しステータス確認

ターミナル

    $ rails db:rollback STEP=4

     Status   Migration ID    Migration Name
    --------------------------------------------------
       up     20210723073418  Devise create users
      down    20210726075554  Create problems
      down    20210726100515  Create active storage tablesactive storage
      down    20210805065731  Create comments
      down    20210806065531  Create likes

すると上のようにproblemsまでのファイルが`down`になりました。

`rails db:rollback STEP=⚪️`の⚪️の部分に入れた数字分だけ最新のファイルからrollbackされます。

## 指定したある一つのファイルのみrollbackする方法

一度`rails db:migrate`して全て`up`にします。

usersのみrollbackしたいとします。

まず`rails db:migrate:status`でマイグレーションファイルの確認します。

     Status   Migration ID    Migration Name
    --------------------------------------------------
       up     20210723073418  Devise create users
       up     20210726075554  Create problems
       up     20210726100515  Create active storage tablesactive storage
       up     20210805065731  Create comments
       up     20210806065531  Create likes

この際、usersの`Migration ID`の欄を確認します。ここでいうと`20210723073418`ですね。

`rails db:migrate:down VERSION=20210723073418`と入力して
ステータス確認すると

ターミナル

    $ rails db:migrate:down VERSION=20210723073418

     Status   Migration ID    Migration Name
    --------------------------------------------------
      down    20210723073418  Devise create users
       up     20210726075554  Create problems
       up     20210726100515  Create active storage tablesactive storage
       up     20210805065731  Create comments
       up     20210806065531  Create likes

usersのみ`down`となりました。


# まとめ

rollbackの方法、何パターンかあるので状況に合わせて使っていきたいと思います。


 もし間違いや改善点などありましたらご指摘お願いいたします。