ポリモーフィック(1) 関連付け

はじめに

ラクティスの必須要件をみながら、ざっくりテーブルはこんな感じで...こんな感じでアクションを...と紙に書いていてふと気づく。

あれ...commentモデルとreportモデル、booksモデルの関連付けってどうやればいいんだ...?

またそれぞれに中間モデルを作るのか...?いや、なんかそれは冗長すぎる気がする...。

そこで調べたところ、「ポリモーフィック関連付け」なる単語が出てきたので調べてまとめた。

ポリモーフィックとは

複数の異なる型やオブジェクトに対して共通のインターフェースを備えること。

ポリモーフィック関連付けは、Railsで、ある一つのモデルが他の複数のモデルに属していることを、一つの関連付けだけで表現できる。

何が嬉しい?

commentモデルを、bookモデルとreportモデル両方に関連するように記述する...と言ったことができるので、本来であれば、それぞれに中間テーブルを作成しなければいけないところを省いて簡潔にできる。

ポリモーフィック関連付けの実装方法

ポリモーフィック関連付けを行うmodelの作成

rails g model comment content:text commentable:references{polymorphic}

とすると、ポリモーフィック関連付けを行うmodelを作成できる。

カラムには、自動でcommentable_typeとcommentable_idなるものが生成される。

commentable_typeには、複数関連しているモデル名(bookとかreport) commentable_idには、複数関連しているモデルのidが入る。

これらによって、そのレコードがどのモデルに対してのcommentなのかを判別できるようになる。

アソシエーションの記述

commentモデルの親モデルにhas_many、commentモデルにはbelongs_toを記述する。

book.rb

has_many :comments, as: :commentable

report.rb

has_many :comments, as: :commentable

comment.rb

belong_to :commentable, polymorphic: true

といった感じ。 これで関連づけは完了!

controllerの処理

commentsはネストされているので、親のidが入っていないと処理できない。

なので、bookかreportのidがちゃんと入るように書かないといけない。

どちらのidが入るかわからないので、両方に対応した書き方が必要になる。

(続く)

参考:Railsのポリモーフィック関連について - Qiita