#referencesを使用した外部キー設定
Rails
でreferences
を用いて外部キーの設定を行おうとしたら、
Mysql2::Error: Table 'テーブル名' doesn't exist: SHOW FULL FIELDS FROM ...
といったエラーがでてだいぶ時間を取られてしまったのでどう解決したかを備忘録として記します。
#エラーとなった実装
エラーとなってしまったmigration
ファイルは次のようなものでした。
※table_names
というテーブルのカラムである
user_id
をuser.id
に、
book_id
をbook.id
に紐付けたい。
class ClassName < ActiveRecord::Migration[5.1]
def change
create_table :table_names do |t|
t.references :user, foreign_key: true,
t.references :book, foreign_key: true
end
end
end
同じ事例を調査していたところ次のような記事を発見。
Rails5.1に移行後のmigrationファイルの注意
この記事によると、Rails5.1後に作成するmigration
ファイルはデフォルトでidカラムにbigint
型を使う(Mysqlの場合)
不都合が生まれるケースが生じる場合があるとのこと。
確かに今回私のケースでは、userがinteger
型でbookがbigint
型で行っている。
記事を参考にし、以下のようにコードを修正。
class ClassName < ActiveRecord::Migration[5.1]
def change
create_table :table_names do |t|
t.integer :user_id, foreign_key: true
t.bigint :book_id, foreign_key: true
end
end
end
修正後、確かにエラーは消えるが、当たり前だがこれでは外部キー設定が何もできていない。。笑
#解決策
とりあえず、型の関係でエラーとなっていることは分かった。
ということで、references
を用いた上でtype
を指定してあげることに。
class ClassName < ActiveRecord::Migration[5.1]
def change
create_table :table_names do |t|
t.references :user, type: :integer, foreign_key: true,
t.references :book, type: :bigint, foreign_key: true
end
end
end
これでうまいこと実行できた。
こんなことにすごく時間をかけてしまった。