我试图在我的网站上消除一些对用户供稿的 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
还涉及用户模型,其中用户有_many Tournaments 和Events,它们都具有不同的属性。为用户加载 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)
此查询尝试检索所有类型为 Tournament 和 Event 的 FeedItem,同时预先加载 Tournament 模型的“游戏”属性。适用于锦标赛,但在迭代 FeedItems 时,事件将引发此属性不存在的错误。
我目前的技巧是对每个 FeedItem 类型进行单独的查询并将记录添加在一起。但是,这会将关联转换为我不想做的数组。
有任何想法吗?