2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

rails 7.0.1 + MySQL/SQLiteの構成だとrails6.0で作成したmigrateファイルの`references`/`belongs_to`定義が動かない

Posted at

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がマージされているので次期バージョンで解消されると思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?