私は自分のサイトでユーザーフィードのいくつかのN + 1クエリを削除しようとしています。 FeedItemモデルへのポリモーフィックな関連を持っている様々なモデル条件付きで多型関連の読み込み
class Event < ActiveRecord::Base
has_many :feed_items, as: :feedable
end
class Tournament < ActiveRecord::Base
has_many :feed_items, as: :feedable
end
class FeedItem < ActiveRecord::Base
belongs_to :feedable, :polymorphic => true
end
ユーザモデルはまた、両方のは、異なる属性を持つユーザーhas_manyのトーナメントやイベント関与しているがあります。ユーザーのFeedItemsを読み込む際に、FeedItemの型に基づいてネストされた属性を条件付きで読み込む方法を教えてください。
私は(squeelのDSLで)何を意味するかの例:
FeedItem.where{ (feedable_id.in(@user.tournaments.ids}) & feedable_type.eq('Tournament')) |
(feedable_id.in(@user.events.ids) & feedable_type.eq('Event')) }.includes(:feedable => :game)
このクエリでは、熱心にトーナメントモデルの「ゲーム」属性のロード中にタイプ大会やイベントのすべてFeedItemsを取得しようとします。トーナメントでうまく動作しますが、FeedItemsを反復処理すると、イベントはこの属性が存在しないというエラーをスローします。
私の現在のハックは、すべてのFeedItemタイプに対して個別のクエリを実行し、レコードを一緒に追加することです。しかし、これは関連付けを、私がしたくない配列に変換します。
アイデア?
あなたは依然として個別のクエリを実行できますが、何かを読み込むのではなく、FeedItem IDをそれぞれ抜き取ることができます。あなたが収集したすべてのIDの配列を作成し、それを単一のクエリに渡します。 – Humza