前回の記事では、マイグレーションを使ったテーブルやカラムの追加について紹介しました。
前回の記事
この記事ではマイグレーションの記述ミスによって戻すことができなくなった場合の対処について紹介したいと思います。
インデックスのカラム名をミスった私は、3つの方法を試したところ最後の方法によって問題が解決しました。
目次
どんなミスをしたか
railsチュートリアルの追加機能の実装に取り組んでいました。
中でも返信機能の実装中に問題は発生しました。
「デ、デプロイができない…」
エラーにはそんなカラム存在しないよという表記がありました。
問題の原因
問題のコードは以下の通り。
class AddInReplyToColumnToMicroposts < ActiveRecord::Migration[7.0]
def change
add_column :microposts, :in_reply_to, :integer, default:0, foreign_key:{ to_table: :users }
add_index :microposts, [:in_reply_to_id, :created_at]
end
end
上記のコードの何が問題かというと追加したカラム名:in_reply_to
とインデックスで指定したカラム名:in_reply_to_id
が違うという初歩的ミスをしていた。
エラーに対してしたこと~その1~
マイグレーションを1つ戻す。
試したコマンドは以下の3つ
rails db:rollback
rails db:migrate:redo STEP = 1
rails db:migrate:down VERSION=戻したいファイルの番号
参考にしたページ
エラーに対してしたこと~その2~
カラム修正のファイルを作って実行する。
今度はこんな記事を見つけました。
よし、やってみよう。
そして以下のコードを書いてみた。
class FixMissingIndex < ActiveRecord::Migration[7.0]
def change
# まずindexとカラムの不整合を解消する
add_column :microposts, :in_reply_to_id, :integer, default:0, foreign_key:{ to_table: :users }
# 不正なindex削除(事前に不整合を解消しないとインデックスが存在しないと言われる)
remove_index :microposts, [:in_reply_to_id, :created_at]
# 不整合解消用に作った一時カラムを削除
remove_column :microposts, :in_reply_to_id, :integer, default:0, foreign_key:{ to_table: :users }
# 正しいindexを貼る
add_index :microposts, [:in_reply_to, :created_at]
end
end
エラーに対してしたこと~その3~
絶対やりたくなかった奥の手を使った。
問題ファイルを消去する。
手順
1.rails db:environment:set RAILS_ENV=development
※この時環境名は自分の環境に合ったものを入れるようにします。
(私は本番環境なのに開発環境の名前入れていてエラーを出しました。)
2.rails db:drop
3.ファイルを消して作り直す
4.rails db:create
5.rails db:migrate
6.rails db:migrate:reset
7.rails db:seed
上記でしたことを説明すると、元あったデータベースをまっさらになくして、
ファイルを作り直して、再度データベースを作り直した。
この方法でやっとできた。
絶対個人開発以外の場面では使ってはいけない奥の手です。
使ってはいけない理由についてはこちらの過去記事に書いてあります。
マイグレートファイルは非常にデリケートなので反映させる前にミスがないか確認することが大事です。
というわけで、初歩的ミスで苦しんだ話でした。