RailsのActiveRecordには単一テーブル継承(STI)とポリモーフィック関係という二つの便利な関係性設定がある。同じような機能を持っているモデルが多数存在してそのモデルたちをまとめたいときとか、多数のモデルが一つのモデルを持ちたいときなどの複雑な関係性をもっと簡単にしてくれるのでその二つの関係性をまとめる。
STI
状況設定
例えば、本とコンピューターを同時に管理するproductsというモデルを作る。もちろんbooks、computersの二つのモデルを作ってもできなくはないけどSTIを通して実装すればテーブルを作らなくてもproductsの一つのテーブルで管理できる。
Productモデル作成
1 2 | |
ここでtypeは必須になる。author, categoryはbookのために、maker, inchはcomputerのためのcolumnになる。
class作成
1 2 | |
こういうclassが作られたら実際に使いたいbook、computerのclassを作成。
1 2 | |
1 2 | |
気をつけないとならないのはProductのclassを継承すること。
これで設定は完了。
すると、
1
| |
こういうふうにデータを作成したら
1
| |
こんな結果になり、Productテーブルに保存される。typeはclass名になる。
呼び出すのも簡単にComputer.find(Product.id)やComputer.allでできる。
Computer.find(Product.id)を実行したら
1
| |
bookのために作ったcolumnは全部nilになる。つまり、一つのテーブルで三つのテーブルを使うようにはなるけど無駄なcolumnが多くなるデメリットもある。
Polymorphic
状況設定
プロジェクトの中で一つのモデルを多数のモデルに関係をつける時がある。
例えば、掲示板の投稿をユーザーが作成した場合と管理者が作成した場合があるとするとPolymorphicで管理できる。
ポリモフィックなテーブルの作成
1 2 3 4 | |
するとpostのmigrationは下記のようになる。
1 2 3 4 5 6 7 8 9 10 11 | |
モデルにbelongs_toとhas_many追加
上記のように実行したらpostのクラスはさらにこういうふうになってます。そしてpostのテーブルにはowner_type, owner_idが生成されます。
1 2 3 | |
そこでadminとuser側だけhas_manyを追加したら良いです。
1 2 3 4 5 6 7 | |
実行
そうした上にconsoleに下記のように実行してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
こういうふうに活用できる。
参照
Rails4でポリモフィックのリレーションを実装する
Rails4でSTI(単一継承テーブル)を行う
Rails ActiveRecordのSTI(Single Table Inheritance)の使い方