ЯoomeR

プログラミング~実装とエラー解決と、時々、AI~

foreign_key:true使うならintegerじゃなくreferencesで!

実験用アプリ

実験用アプリのGithub

使用するアプリの仕様

モデルは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型」を使用しよう!