TL;DR
MySQL
を使用しているrails
アプリケーションの場合、rails
バージョンを7.0.1にして、rails
6.0で生成したmigrateファイルを使ってdb migrateを行うとエラーが発生します
詳細
発生するケース
例えばusers
テーブルが存在していて、users
に紐づく子テーブルposts
を追加しようとした場合で以下のようなmigrateファイルをrails6.0の作成したとします。
class Posts < ActiveRecord::Migration[6.0]
def change
create_table :posts do |t|
t.references :users, foreign_key: true
t.timestamps
end
end
end
の後rails7.1にアップグレードを行いmigrate reset
などmigrateを再度実行した場合に以下のエラーが発生します。
Column `user_id` on table `posts` does not match column `id` on `users`, which has type `bigint`. To resolve this issue, change the type of the `user_id` column on `posts` to be :bigint. (For example `t.bigint :user_id`).
Original message: Mysql2::Error: Referencing column 'user_id' and referenced column 'id' in foreign key constraint 'fk_rails_b01e4286d5' are incompatible.
/app/db/migrate/posts.rb:3:in `change'
おきている事
rails g migrate
コマンドでmigrateファイル生成するとActiveRecord::Migration[6.0]
の様に[]
でその時のrailsバージョンに対応するクラスを取得して、そのクラスを継承したクラスを作成します。
class Users < ActiveRecord::Migration[6.0]
def change
end
end
その時のrailsバージョンに対応するクラスを取得する仕組みによって、バージョンの互換性を保つ仕組みがあるのですが、rails7.0.1での対応によって6.0の互換性がなくなってしまった不具合です。
railsの対応
対応されているPRがマージされているので次期バージョンで解消されると思います。