STI(単一テーブル継承)について
STI(単一テーブル継承)
単一テーブル継承は、オブジェクトの継承関係を1つのテーブルで表現します。テーブルにはサブクラスを判断するためのカラム(type)を持たせます。
もしも同じカラムをもつテーブルが複数ある場合に、一つのテーブルにまとめて管理することで、余分なテーブルを作成せずに済みます。
STIの例
CoffeeクラスとTeaクラスのカラムが全部同じならば、一つCafesというテーブルを作って継承することでテーブル数を減らします。
CoffeesとTeasはテーブルではないのでDBには存在しません。継承データは全てCafesテーブルに保存されていきます。Typeカラムにクラス名(CoffeeかTea)を入れてどちらのクラスのデータなのかを区別しています。
MenusテーブルとCofeeクラス、Teaクラスに直接アソシエーション関係を結びたいのでモデルの定義は以下のようになります。
※ MenuとCafeにはアソシエーションは組みません。
menu.rb class Menu < ApplicationRecord belongs_to :coffee belongs_to :tea end
cafe.rb class Cafe < ApplicationRecord validates :name, presence: true, uniqueness: true validates :price, presence: true end
coffee.rb class Coffee < Cafe has_many :menus end
tea.rb class Tea < Cafe has_many :menus end
CoffeeクラスとTeaクラスは継承元がApplicationRecordを継承したCafeになっています。