0

(使用导轨 4)

我有一个订阅Event模型。has_many在事件列表中,我显示订阅数。在我看来,要为我拥有的每个事件执行此操作:

event.subscriptions.count

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

为了解决这个问题,我想获得所有订阅,类似于以下内容:

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

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

谢谢!

4

2 回答 2

3

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

于 2013-09-11T17:04:35.613 回答
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
于 2013-09-11T17:08:17.297 回答