とーますメモ

Ruby on Rails / Goなどの学習メモ

【Rails】Rails4で親モデル用のサブディレクトリを作成し、STI(単一テーブル継承)をやってみる

サブディレクトリの作成

サブディレクトリを配置する場所は
app/models内。

ディレクトリ名はここでは「app/models/parents」とした。

Rails4ではmodels直下しか読み込まれないので
「config/application.rb」内に以下を追加し、models内のサブディレクトリ内のファイルも読み込まれるようにする。

config.autoload_paths += Dir["#{config.root}/app/models/**/"]

STIの設定

STIの説明については、以下のページが詳しい。
Railsでスーパータイプ/サブタイプを表現する方法を比較してみる - Qiita
[Rails]Model/テーブル設計で必ず覚えておきたいSTI | Raccoon Tech Blog [株式会社ラクーンホールディングス 技術戦略部ブログ]
みんなRailsのSTIを誤解してないか!? - Qiita

STIではなく具象クラスで対応する場合は以下の方法も使えそう。
[Rails 5] モデルの継承元がActiveRecord::BaseからApplicationRecordに変更された
[Rails] self.abstract_class = true の意味と挙動 « Codaholic

まずはモデルが参照するテーブルにtypeカラムを追加する。
XXXXXはテーブル名

$ bundle exec rails g migration AddTypeToXXXXX type:string

このtypeには「サブクラス名」が保存される。
サブクラスでnewすると、そのサブクラス名が自動的に保存され
allやfindすると自動的に、条件文にtype IN ('サブクラス名')が指定される。

すごい便利。

[その他参考]
サブディレクトリに配置したモデルクラスの名前を変更する - Ruby1.9とRails3で何か作ってみる
モデルをサブディレクトリに分割する Rails 3.2 - Qiita
https://qiita.com/yebihara/items/9ecb838893ad99be0561