There's an echo in my head

日々のメモ。

schema_plusで外部キー制約をかける

schema_plusを使うとcreate_tableadd_columnでカラムを定義するときに:referencesオプションにテーブル名を渡すだけで、外部キー制約を手軽にかけることができる。

create_table :posts do |t|
  t.integer :category_id, references: :categories
end

個々に指定するのが面倒なときは、auto_createを設定すれば名前が*_idにマッチするカラムに対して自動的に外部キー制約をかけてくれる。

SchemaPlus.config.foreign_keys.auto_create = true

このときポリモーフィック関連を使っていると、カラム名*_idなんだけどそれに対応した(ARの規約から自動的に推測される)テーブルがない→テーブルの作成orカラムの追加ができないって現象が発生する。そんなときは:referencesnilを指定してやればよい。

create_table :posts do |t|
  t.string :attachable_type
  t.integer :attachable_id, references: nil
end

ちなみに前述したように:referencesに具体的なテーブル名を与えることもできるけど、ポリモーフィック関連では対応するテーブルがひとつとは限らないのでその方法はあまり有効ではない。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。