n + 1用于计算has_many关联中的项目

时间:2013-09-11 16:54:57

标签: ruby-on-rails ruby-on-rails-4

(使用rails 4)

我有一个Event模型has_many订阅。在事件列表中,我显示订阅的数量。为了我在每个事件的视图中执行此操作:

event.subscriptions.count

但是,这会导致性能下降,因为对于每个事件,都会执行后续查询以获取subscriptions计数。

为了解决这个问题,我想要获得所有订阅,这些都是这样的:

subscription_count = Event.all.map { |e| {e.id => e.subscriptions.count} }

然后,我只是在event id哈希中查找subscription_count,而不是对每个事件执行查询。但是,这显然仍然分别执行所有查询。有没有办法执行一些聚合查询来一次完成工作?

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以在事件表中为订阅设置counter_cache列。另一种方法可以获取事件,如Event.includes(:subscription),在视图中你可以使用e.subscription.size而不是count也可以查看此链接 如果您只需要相关模型的计数 http://railscasts.com/episodes/23-counter-cache-column

答案 1 :(得分:0)

你可以这样做:

@events = Event.joins('LEFT JOIN subscriptions ON subscription.event_id = event.id').group('events.id').select('events.*, COUNT(subscriptions.id) AS number_of_subscriptions')

然后在视图中使用:

event.number_of_subscriptions