PeaceJet

証券会社で証券外務員(転職しました!)をやりながら、マーケティングやデータ分析・UI/UX改善などを行っています。

rails db:migrateしたのに反映されないときの対処法



rails db:migrateしたのに・・・。

反映されないのはマイグレーションファイルのバージョンが関係しているからです。

マイグレーションファイルは、db/migrate に格納されており、それぞれに日付を含む14桁の数字がついていると思います。 これこそが、バージョンとして管理されています。

現在のバージョンを確認する場合には、以下のコマンドを入力することで確認することができます。

$ ./bin/rails db:version

新しいバージョン

たとえば、何かのカラムを付け足したり削除したりして新しいマイグレーションファイルを作成したとします。 その状態で、以下のコマンドを実行すると、新しいマイグレーションファイルが適応されます。

$ ./bin/rails db:migrate

適応される範囲

ここからが問題なのですが、マイグレーションファイルを直接いじったりすることありますよね? 自分は、結構あったりします。 本当は、あまり良くないと思いますが、マイグレーションファイルがあまりにも増えすぎて、逆に管理がしずらいなんこともあるかもしれません。

特にサービスがスタートしていないアプリケーションなんかは、ゴールと機能要件だけさくっと決めて、作ったりすることもあります。 そんなとき、たとえばCSVインポートするときに「どのカラムが必要だっけ?」ってなるし。 「Ransackで検索機能実装するけど、この場合だと別に検索用のカラム用意したほうが効率的!」 なんてこともあったりします。

そんな場合に、結構、マイグレーションファイルをちょこちょこ書き換えるのですが、あれ反映されない!

./bin/rails db:migrate:resetとdb:rollback

たとえば、「db/migrate/20181009010612_create_members.rb」を編集したとして、以下のコマンドを実行しても反映されません

$ ./bin/rails db:migrate

なぜなら、現在のバージョンが「db/migrate/20181009010612_create_members.rb」だからです。 このバージョンよりも新しいバージョンが出現したとき、上記のコマンドを実行すると、「db/migrate/20181009010612_create_members.rb」も含めた変更が反映されます。

上記の点を踏まえると、現在のバージョンよりも以前のバージョンに戻し、再びdb:migrateをしてあげればいいということになります。

#

すので、下記のコマンドを実行すればいいのですが・・・

$ ./bin/rails db:rollback

# エラーすることないですか?
# スキーマファイルとマイグレーションファイルを比較して、意味不明なカラムが存在していたりするとエラーが発生したりします。

$ ./bin/rails db:migrate

なので、開発するときは以下のコマンドを実行することが多い。 一人で作っている場合は有効だと思う。 ただし、データベースに入っているデータがすべてリセットされますので注意してください

$ ./bin/rails db:migrate:reset

これを実行すると、一度、データベースを削除して作り直し、マイグレーションファイルを古い順から適応してくれます。

なので・・・。

$ ./bin/rails db:migrate:reset && ./bin/rails db:seed && ./bin/rails server -b 0.0.0.0 -p 3000

こんなコマンドを書いて、実行してあげることもあったりして(笑) 便利な方法ないのかな・・・。

そもそも、あまりやらない行為かもしれませんし。

その他のエラー

$ ./bin/rails db:migrate:reset

実行して、「bin/rails db:environment:set RAILS_ENV=development」とか出た場合には、

$ ./bin/rails db:environment:set RAILS_ENV=development

これをシェルに入れて実行してあげればいいと思います。