Rails のマイグレーション時に references メソッドの対象テーブルがない場合は失敗する

Rails のマイグレーションで失敗する

標題でほぼ言い尽くされているし、何をお前は当たり前のことを言っているんだ状態だとは思いますが記録として残しておきます。

マイグレーションファイルに references メソッドがある場合

以下のようなマイグレーションファイルがあったとします*1

class Items < ActiveRecord::Migration[5.1]
  def change
    create_table :items do |t|
      t.references :user, foreign_key: true
      t.string :name, null: false
      t.string :price, null: false

      t.timestamps
    end
  end
end

ここで、ItemモデルはUserモデルを参照しています。

従って、当然ながらこのテーブルを作る際にはusersテーブルが存在していなければなりません。存在していないと以下のようなエラーになります*2。エラーメッセージが遠回しなので最初は原因に気づきませんでした。

$ bundle exec rails db:migrate
== 20170705040556 Items: migrating =====================================
-- create_table(:items)
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Table 'database_name.items' doesn't exist: SHOW FULL FIELDS FROM `items`

解決法

いや、当たり前なんですが、referencesの対象となっているテーブルをまず先に作ればよいです。マイグレーションファイルの日時部分の数字を変更して、先に作るべきテーブルの番号を若くすれば OK です。

*1:即興で作ったのであまり突っ込まないで下さい

*2:MySQL の場合

Powered by はてなブログ