ポリモーフィック(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が入るかわからないので、両方に対応した書き方が必要になる。
(続く)