7

サイトのユーザー フィードに対する 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

ユーザーモデルも関係しており、ユーザーには異なる属性を持つ多くのトーナメントとイベントがあります。ユーザーの FeedItem をロードするとき、どの 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)

このクエリは、Tournament モデルの「game」属性を積極的にロードしながら、Tournament および Event タイプのすべての FeedItem を取得しようとします。トーナメントでは問題なく動作しますが、FeedItems を反復処理すると、イベントはこの属性が存在しないというエラーをスローします。

私の現在のハックは、すべての FeedItem タイプに対して個別のクエリを実行し、レコードを一緒に追加することです。しかし、これは関連付けを私がしたくない配列に変換します。

何か案は?

4

1 に答える 1