ActiveRecordにはポリモーフィック関連という、便利に使える機能がある。
Active Record の関連付け - Railsガイド
パット見便利なんだけど、いくつかトラップがあって、typeというカラムにどのモデルと紐づくのか?が記録されるので、データを見るまでアプリケーション側からは結合することができない。
現にeager_loadやjoinsをしようとするとこういったエラーが出る。ちなみにpreloadはできる。
=> Error: the evaluation of `...` failed with the exception 'Cannot eagerly load the polymorphic association :foo_bar'
typeがわからないから読み込めないのであって、じゃあtypeがわかればいいのでは…?というアプローチをするとうまくいく。
具体的には、ポリモーフィック関連がついているモデルに、関連先のアソシエーションを別途設定する。ただしProcでtypeを指定する、というもの。Railsdocの例に合わせるとこんな感じ。
class Picture < ApplicationRecord
belongs_to :imageable, polymorphic: true
belongs_to :employee, -> { where(picture: { imageable_type: :employee }) }, foreign_key: :imageable_id, optional: true
belongs_to :product, -> { where(picture: { imageable_type: :product }) }, foreign_key: :imageable_id, optional: true
end
これでやりほうだい! そのtypeのレコードは存在しない可能性があるので、INNER JOINなのかLEFT JOINなのかは気をつける必要がある、かもしれない。場合によるか。