rails db:migrate実行時にreferencesを使った外部キー制約ができない時の対処法について

個人アプリを制作している時にmySQLでテーブルを作成しようとすると
rails で外部キー制約をかける時にエラーが発生したので、その対処法についてご紹介します。

外部キーの設定をしようとした時に、referencesを使用してrails db:migrateをかけたところエラーが発生しました。1対多と多対多のリレーションでも同じようなエラーが発生します。

class CreatePrJobs < ActiveRecord::Migration[6.0]
  def change
    create_table :pr_jobs do |t|
      t.references :pr, foreign_key: true
      t.references :job, foreign_key: true

      t.timestamps
    end
  end
end

エラー内容

== 20200905041353 CreatePrJobs: migrating =====================================
-- create_table(:pr_jobs)
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Column `pr_id` on table `pr_jobs` does not match column `id` on `prs`, which has type `bigint(20)`. To resolve this issue, change the type of the `pr_id` column on `pr_jobs` to be :bigint. (For example `t.bigint :pr_id`).
Original message: Mysql2::Error: Cannot add foreign key constraint
/Users/shunjiro/rails-self-project/Dispatch-site/db/migrate/20200905041353_create_pr_jobs.rb:3:in `change'
/Users/shunjiro/rails-self-project/Dispatch-site/bin/rails:9:in `<top (required)>'
/Users/shunjiro/rails-self-project/Dispatch-site/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'

色々と調べると下記が原因とわかりました。

原因

  • デフォルトのidカラムはinteger型で作成されるが、rails5.1以降からはbignit型で作成される
  • referencesをつかった書き方だと型が合致せず、エラーとなるので揃えてやる必要がある。

対処方法

  1. referencesをつかう時にidキーをinteger型に変更する
  2. referencesを使わない外部キー設定にする (参考記事をご参考ください)

2番目の方法を試すとがなぜかダメでした、仕方なく1番目のreferencesを使わない書き方で
rails db:migrateを実行したところ解決しました!

class CreatePrJobs < ActiveRecord::Migration[6.0]
  def change
    create_table :pr_jobs do |t|
      t.integer :pr_id, foreign_key: true
      t.integer :job_id, foreign_key: true

      t.timestamps
    end
  end
end

今までreferencesで設定できていましたが突然できなくなってしまったので、
勝手にバージョンを上げてしまったことが原因だと思います。

参考記事:
qiita.com

github.com