黒縁眼鏡は海を飛ぶ

IT中心にそこはかとなく

ActiveRecordで外部キー制約にオプションを付与する

数時間唸ってやっとできたのでメモ。。。

簡単なブログ用の関係を考えてみます。

  • 記事(Entry)
    • id integer(pk)
    • body text
  • コメント(Comment)
    • id integer(pk)
    • entry_id integer(fk)
    • body text

上記のような親子関係を作って、記事テーブルの要素が削除された時に関連するコメントも一緒に削除したい時。
要はCASCADEを指定したい時です。

記事テーブル用のmigrationファイルは以下の通り。

class CreateEntries < ActiveRecord::Migration
  def up
    create_table :entries do |t|
      t.text :body
    end
  end

  def down
    drop_table :entries
  end
end

コメントテーブル用のmigrationファイルは以下の通り。

class CreateComments < ActiveRecord::Migration
  def up
    create_table :comments do |t|
      t.references :entry, index: false
      t.text :body
    end
    add_foreign_key :comments, :entries, on_delete: :cascade
  end

  def down
    drop_table :comments
  end
end

add_foreign_keyで指定しているon_deleteオプションで指定できるのは以下の通り。

No オプション 説明
1 restrict 被参照行の削除を防止する
2 cascade 被参照行が削除された時、参照行も削除する
3 nullify 被参照行が削除された時、参照行の該当箇所にnullを挿入する

on_updateもちゃんと指定できるらしい。

dependentはどういった時に使うのかがわかってなくてモヤモヤ。