[Rails]エラーStandardError: An error has occurred, all later migrations canceled: Column `外部キー名` on table `テーブル名` does not match column `id` on `テーブル名`の対処方法


エラー内容

$ rails db:migrate

上記コマンドを実行すると発生するエラー。ターミナルでのエラー表記は以下の通り。

エラー文一部抜粋.
Column `user_id` on table `items` does not match column `id` on `users`, which has type `bigint(20)`. To resolve this issue, change the type of the `user_id` column on `items` to be :bigint. (For example `t.bigint :user_id`).

エラー文の一部を翻訳してみると...。

エラー文翻訳.
テーブル `items` のカラム `user_id` が `users` のカラム `id` と一致しません。この問題を解決するには、`items` の `user_id` カラムの型を :bigint に変更します。(例えば `t.bigint :user_id`)。

今回はitemsテーブルが外部キーとして指定しているカラムが参照元と一致しませんよ!というエラーですね。

対処法(仮説)

結論、Railsでは外部キーを使用する際はreferences型を推奨しているので、bigint型を使用する必要はありません。

このエラーのポイントは参照できませんということなので、マイグレーションファイルの作成順に問題があると仮説できます。

マイグレーションファイルの作成順とは?

外部キーを使用するテーブル(references型を記述するテーブル)と参照されるテーブルには作成順によって参照できなくなる場合があり、今回のエラーは作成順序の誤りで発生しました。

作成順は、①参照される側のテーブル→②外部キーを使用するテーブル(references型を記述するテーブル)です。
対処法はマイグレーションファイルの作成日時を修正してあげれば解決できます。

対処法(仮設検証)


添付画像の数字部分を、参照される側のテーブルよりも外部キーを使用するテーブルの数字を大きくすれば解決します。

エラー分からは少し推測しづらいエラーですね。

今回の場合だと、create_items20200909000000なら20200909100000でいいです。
ちなみに、最初の4桁は西暦、次の4桁は月日です

最後に

今回のエラーはテーブル数が増えると発生しやすいエラーなのかなと思います。
ただ、対象法を知っていれば問題なく解決できると思いますので、参考にしてみてください!