search
LoginSignup
272

More than 1 year has passed since last update.

posted at

updated at

【Rails】$rails db:rollbackしたい時の間違えない手順

はじめに

初心者の僕は、よくmigration周りでやらかします。
一人でやっているときは「ロールバックしちゃえ〜」「migrationファイル消しちゃえ〜」
とかやってもあまり問題ないと思いますが、
チームでやっているとそんなことは許されません・・・

なので
今回丁度勉強で作っていたサンプルで失敗したので、ロールバックの正しいやり方?を学びました。

migration周りの注意

そもそもなぜこのあたり注意しないといけないのか?

今更気づいたので一応書いておきます。
migrationファイルを書き換えたり削除した場合、
当然次回$rake db:migrateした時にテーブル構造が変わってきます。

一人でやっている分には大して支障はないですが、
これをチームでやっている場所なんかにあげたりしてしまうと・・・
それが他の方の環境まで変わってしまい、

最悪「コードの辻褄が合わない!」なんてことになりかねません。

ということで、この辺のファイルがどれほど恐ろしいものか気づいたので
今後は普段から取り扱いに注意する癖をつけようと思いました。

rollbackの手順

さて本題です。前述の通りこの辺は取り扱い注意なので、

失敗しない手順を学びました。

現在の状況を確認する
まずはどこまでmigrateが実行されているかを確認しましょう。

$rails db:version
このコマンドで確認できます。

$ rails db:version
Current version: 20190225214835

こんな感じで出てきます。

20190225214835まで実行されていることが分かります。

ロールバック

次に戻したいところまでロールバックします。

一つ前まで戻す
$ rails db:rollback
任意のファイルまで戻す
$ rails db:rollback STEP=

現在地を含めた○個前までなかったことにしてくれます。

(つまり○+1個前のファイルまで実行された状態)

migrateされていないファイルを確認

念のためどのファイルが実行されていないか確認します。

$ rails db:abort_if_pending_migrations
You have 1 pending migrations:
20190225214835 UsersAddColumnProfile

20190225214835のProfileカラムが作られていないようです。

ファイルを修正

class UsersAddColumnProfile < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :profile, :text  #profileカラムを追加
  end
end

今回は例ですがUsersテーブルにprofileカラムを追加したかったので
add_columnで追加します。

migrate

修正が完了したらマイグレートを実行します。

$ rails db:migrate
== 20190225214835 UsersAddColumnProfile: migrating ============================
-- add_column(:users, :profile, :text)
   -> 0.0193s
== 20190225214835 UsersAddColumnProfile: migrated (0.0194s) ===================

これで無事修正完了です。

参考
http://song-of-life.hatenablog.com/entry/2017/11/12/234703

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
272