私は次のように移行を書きました:
class CreateTableSomeTable < ActiveRecord::Migration[5.1]
def change
create_table :some_tables do |t|
t.references :user, foreign_key: true
t.references :author, references: :user, foreign_key: true
t.text :summary
end
end
end
これは、データベーステーブルを作成する基本的な移行です。ただし、Rails db:migrate
を実行すると、非常に奇妙なエラーメッセージが移行を中止します。
Mysql2 :: Error:テーブル 'my_database.some_tables'は存在しません:SHOW FULL FIELDS FROM 'some_tables'
これは、テーブルが存在するためにテーブルを作成できないというエラーが表示されているかのようで、これは意味がありません。
私が見て試したもの:
bundle
を実行して、すべてのgemがインストールされたことを確認しましたschema.rb
ファイルを削除し、別のコピーのデータを使用してデータベースを再作成し、rake db:schema:dump
を実行してschema.rb
ファイルを再作成しました。もう一度移行を実行しようとしたところ、同じエラーが発生しました。Rails 5.1.1
とmysql2 0.4.6
を使用しています
移行を実行するためのヒントはありますか?
私は回避策を見つけましたが、それでも私には非常に戸惑っています。
ログファイルのエラーメッセージは、問題を正確に示していませんでした。何らかの理由で、それはRails 5.1.1
またはmysql2 0.4.6
である可能性がありますが、何らかの理由でcreate_table
ブロック内でreferences
を使用するのは好ましくありません。それは過去に私のために働いたので非常に奇妙です。
だから私はこれから移行を変更しました:
class CreateTableSomeTable < ActiveRecord::Migration[5.1]
def change
create_table :some_tables do |t|
t.references :user, foreign_key: true
t.references :author, references: :user, foreign_key: true
t.text :summary
end
end
end
これに:
class CreateTableSomeTable < ActiveRecord::Migration[5.1]
def change
create_table :some_tables do |t|
t.integer :user_id
t.integer :author_id
t.text :summary
end
end
end
そしてそれはうまくいった。
references
はsqlite3
で問題なく動作するため、非常に奇妙です(私は、ダミーアプリを生成してこれをテストし、references
列を使用してscaffoldコマンドを実行し、Rails db:migrate
を実行して、すべてが機能しました)。
Rails 5.1。に移行する前に作成された既存のモデルへの参照を持つ新しいモデルを作成しようとすると、同様のエラーが発生しました。
エラーメッセージはそれほど明確ではありませんでしたが、私の場合、問題は古いモデルの主キーと新しいモデルの外部キーの間のデータ型の不一致であることが判明しました(MySQLでは許可されていません)。 Rails 5.1以降、すべての主キーと外部キーのデフォルトのデータ型はbigintですが、古いモデルの場合、主キーの型はまだ整数でした。
現在のモデルのすべての主キーと外部キーをbigintに変換することでこれを解決したので、Rails新しいデフォルトを使用して、それを忘れることができます。
回避策として、新しい外部キーに整数タイプを指定して、古いモデルの主キータイプと一致させることもできます。次のようなもの:
class CreateUserImages < ActiveRecord::Migration[5.1]
def change
create_table :user_images do |t|
t.references :user, type: :integer, foreign_key: true
t.string :url
end
end
end
ActiveRecordマイグレーション5.1の大きな問題は、IDがINTではなくBIGINTであることが期待されることです。そのため、Rails 5.1以前に作成された別のテーブルを参照する列を追加すると、列タイプがBIGINTであるが、代わりに単なるINTであるため、エラーが発生する最善の解決策は、マイグレーションを変更して列のタイプをintに変更することです。
class CreateTableSomeTable < ActiveRecord::Migration[5.1]
def change
create_table :some_tables do |t|
t.references :user, foreign_key: true, type: :int
t.references :author, references: :user, foreign_key: true
t.text :summary
end
end
それはうまくいくはずです。
これは私を狂わせました、私はこれについて他の人が示唆したものとは異なる理由を見ていたと思います。私の場合、移行ファイル名がその中の移行クラスと正確に一致しなかったために起こりました。たとえば、20171205232654_bonus.rb
という名前の移行ファイルがありましたが、クラス内ではclass CreateBonus < ActiveRecord::Migration[5.1]
と宣言されていました。ファイル名を20171205232654_create_bonus.rb
に変更すると、すべてが機能しました。
これは、完全な足場ではなく、マイグレーションのみを作成しているという事実に関係している可能性があります。どうしてそのミスマッチに巻き込まれたのか本当にわかりません。