DesignAssembler

備忘録に近い

Railsの単一テーブル継承

単一テーブル継承(STI)とは

普通は複数のテーブルが必要になる関連したテーブルを1つのテーブルにまとめる事です。

db構造が簡単になりDRYになります。

例えば、JapaneseテーブルとAmericanテーブルがあったとして、JapaneseテーブルとAmericanテーブルをRaceテーブルにまとめます。(JapaneseテーブルとAmericanテーブルは存在しない)

typeカラムでJapaneseかAmericanか判別します。

この2つのテーブルを f:id:hyottokoaloha:20160130123600p:plain

Raceテーブルにまとめます

f:id:hyottokoaloha:20160130123540p:plain

実際のレコードはこんな感じになります

f:id:hyottokoaloha:20160130123617p:plain

raceモデルの作成
$ rails g model race name:string type:string

#japanese.rb
class Japanese < Race
end

#american.rb
class American < Race
end

#コンソール
> Japanese.create(name:"Tarou")
  => #<Japanese id: 1, name: "Tarou", type: "Japanese", created_at: "2016-01-30 03:20:56", updated_at: "2016-01-30 03:20:56">

> American.create(name:"Joe")
  => #<American id: 2, name: "Joe", type: "American", created_at: "2016-01-30 03:25:21", updated_at: "2016-01-30 03:25:21">

> Race.all
  => #<ActiveRecord::Relation [#<Japanese id: 1, name: "Tarou", type: "Japanese", created_at: "2016-01-30 03:20:56", updated_at: "2016-01-30 03:20:56">, #<American id: 2, name: "Joe", type: "American", created_at: "2016-01-30 03:25:21", updated_at: "2016-01-30 03:25:21">]>

各モデルクラスでcreateすると自動でtypeが入ります。

参考

以下2つのサイトが非常に詳しいです。参考にさせてもらいました。ありがとうございます。

dev.classmethod.jp

qiita.com