読者です 読者をやめる 読者になる 読者になる

国境の南

Ruby, Railsメイン

ポリモーフィック関連テーブルでもEager Loadingがしたい(1)

ポリモーフィック関連のおさらい

まず、ポリモーフィック関連のおさらいから。
まずは、「ポリモーフィック関連を使わない」具体的な実装をみてみます

例えば小説サイトで、ユーザーが、小説モデル、ブログモデル、Tweetモデルを持てて、
上の全てのモデルに対して、ユーザーはコメントを付けることが出来る、という場合

class Novel
  has_many :comments
end

class Blog
  has_many :comments
end

class Tweet
  has_many :comments
end

class Comment
  belongs_to :novel
  belongs_to :blog
  belongs_to :tweet
end

このやり方だと
- Commentモデルの使い回しのためにbelongs_toが増えるのが冗長 - コメント可能なモデルを変更する度に、Commentモデルのテーブル構造も変更しなければならない
のが面倒

そこで、ポリモーフィック関連を使うとこういう実装に出来ます

class User
  has_many :novels
  has_many :blogs
  has_many :tweets
  has_many :comments
end

class Novel
  belongs_to :user
  has_many :comments, as: :commentable
end

class Blog
  belongs_to :user
  has_many :comments, as: :commentable
end

class Tweet
  belongs_to :user
  has_many :comments, as: :commentable
end

class Comment
  belongs_to :user
  belongs_to :commentable, polymorphic: :true
end

これを実現する引き換えに、どこに対するコメントなのかを判別するために
Commentモデルは、commentable_idと、commentable_typeを持ちます
詳しくは↓
railsguides.jp

次は、このポリモーフィック関連テーブルをいい感じでjoinするケースについてまとめます