実験用アプリ
使用するアプリの仕様
モデルはuserとarticleの2つのみ。
ログインしているuserは複数articleを投稿できる。
前提:foreign_key:trueとは
外部キー制約のオプション。
親テーブルに対象が存在しない場合、子テーブルへの保存ができないようにする。
実験1.references型の場合
class CreateArticles < ActiveRecord::Migration[6.0] def change create_table :articles do |t| t.string :title, null: false t.string :content, null: false t.references :user, foreign_key: true t.timestamps end end end
articleのマイグレーションファイルは上記のとおりである。
userの外部キーカラムはreferences型で実装している。
userの生成
userを1人だけ生成しておく。
唯一のuserのidは1である。
articleの生成
userのidを、存在しない「2」を指定して保存を試みる。
すると、
対象のidが親テーブルに存在しないため、エラーが発生し保存ができない。
2.integer型の場合
class CreateArticles < ActiveRecord::Migration[6.0] def change create_table :articles do |t| t.string :title, null: false t.string :content, null: false t.integer :user_id, foreign_key: true t.timestamps end end end
次はinteger型にして実験する。
外部キー制約(foreign_key:true)は実験1と同じく記述されている。
userの生成
実験1と同様、1人のみ生成している。
articleの生成
存在しないuserのid「2」を指定して保存を試みる。
しっかり保存できていることが確認できる。
結論:integer型では外部キー制約を実装できていない
integer型では「foreign_key:true」が役割を果たさず、飾りとなってしまっている。
よって、外部キー制約を実装したい場合は「references型」を使用しよう!