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 です。