koukiblog

たぶんweb系の話題

Rails5.1からidカラムがbigintになるのでその対応

Rails5.1からidカラムがbigintになるのでその対応メモ。
↓は対応した人のエントリです。bigintが必要になってから変更するのでは間に合わないので最初から設定しちゃおうみたいな感じですね。
Rails 5.1: Default Primary Keys Are Now BIGINT

このPR(Restore the behaviour of the compatibility layer for integer-like PKs by kamipo · Pull Request #27389 · rails/rails · GitHub) にもあるように互換性には気を使って開発してくれていますが、schema.rbは migrate:reset タスクを実施するなどして再生成する必要があるみたいです。

schema.rbが下記のようになっていたとして、

create_table "users" do |t|
  t.string   "name",       null: false

create_table "addresses" do |t|
  t.integer  "user_id"
  t.string   "name",       null: false

 add_foreign_key "addresses", "users"

5.0以前では問題なくテーブルの作成と外部キーの設定が行えていましたが、5.1ではエラーになります。
それはusers,addressテーブルのidカラムがbigintになりますが、外部キーを設定しようとしているaddressesテーブルのuser_idカラムはint, usersテーブルのidカラムはbigintと差異が出てしまうからです。
migrateファイルが正しく管理されている場合は、 migrate:resetタスクを実行することで、Rails5.1でも以前のDB定義を維持することができるschema.rbを出力することができます。

再生成すると以下のようになります。

create_table "users", id: :integer  do |t|
  t.string   "name",       null: false

create_table "addresses", id: :integer do |t|
  t.integer  "user_id"
  t.string   "name",       null: false

 add_foreign_key "addresses", "users"

id: :integerが各テーブルに付与され、エラーが解決されます。

schema.rbを以前のDB定義を維持できるように変更し、そのあとで、必要に応じて各テーブルのidカラムをbigintにしていくのが良いんじゃないかなーと思います。