学習記録

アウトプット用に作りました

STI(単一テーブル継承)について

STI(単一テーブル継承)

単一テーブル継承は、オブジェクトの継承関係を1つのテーブルで表現します。テーブルにはサブクラスを判断するためのカラム(type)を持たせます。

もしも同じカラムをもつテーブルが複数ある場合に、一つのテーブルにまとめて管理することで、余分なテーブルを作成せずに済みます。


STIの例

CoffeeクラスとTeaクラスのカラムが全部同じならば、一つCafesというテーブルを作って継承することでテーブル数を減らします。

f:id:kimura34:20210426180845p:plain

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になっています。

参考 : 【Rails】単一テーブル継承(STI)について - Qiita