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
はどういった時に使うのかがわかってなくてモヤモヤ。