ActiveRecordの抽象サブクラスを作る

普通にActiveRecordのサブクラスを作るとSTIと見なされて、サブクラスはテーブルと一対一対応にはなりません。親クラスだけがテーブルと対応してて、サブクラスのインスタンスには親クラステーブルから必要なのだけとってきて設定される感じ。


これはこれで便利なんだろうけど、そうじゃなく逆にサブクラスがテーブルと対応してて親クラスはサブクラスを抽象化した存在であってほしいこともあります。そういう時はこう。

class AbstractClass < ActiveRecord::Base
  self.abstract_class = true
end

class OneSubClass < AbstractClass; end
class AnotherSubClass < AbstractClass; end

こうするとabstract_classesテーブルではなく、one_sub_classesテーブルとanother_sub_classesテーブルにちゃんとデータが保持されます。