Ruby on rails n+;1用于计算a中的项目有多个关联
(使用rails 4) 我有一个Ruby on rails n+;1用于计算a中的项目有多个关联,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,(使用rails 4) 我有一个事件模型,有很多订阅。在事件列表中,我显示订阅数。在我看来,要在我参加的每一项活动中做到这一点: event.subscriptions.count 但是,这会导致性能下降,因为对于每个事件,都会执行后续查询以获取订阅计数 为了解决这个问题,我想获得所有订阅,大致如下: subscription_count = Event.all.map { |e| {e.id => e.subscriptions.count} } 然后,我不再对每个事件执行查询,而是
事件
模型,有很多订阅。在事件列表中,我显示订阅数。在我看来,要在我参加的每一项活动中做到这一点:
event.subscriptions.count
但是,这会导致性能下降,因为对于每个事件,都会执行后续查询以获取订阅计数
为了解决这个问题,我想获得所有订阅,大致如下:
subscription_count = Event.all.map { |e| {e.id => e.subscriptions.count} }
然后,我不再对每个事件执行查询,而是在subscription\u count
散列中查找event id
。但是,这显然仍然单独执行所有查询。有没有一种方法可以执行一些聚合查询来一次性完成这项工作
谢谢 您可以在订阅的事件表中设置计数器缓存列。另一种方法是获取事件,如Event.includes(:subscription),在视图中可以使用e.subscription.size而不是count,也可以检查此链接
如果只需要关联模型的计数
您可以在订阅的事件表中设置计数器缓存列。另一种方法是获取事件,如Event.includes(:subscription),在视图中可以使用e.subscription.size而不是count,也可以检查此链接
如果只需要关联模型的计数
你可以做如下事情:
@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
你可以这样做:
@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
您可以在订阅的事件表中设置计数器缓存列。另一种方法是获取事件,如Event.includes(:subscription),在视图中可以使用e.subscription.size而不是count。您可以在事件表中为订阅设置计数器缓存列。另一种方法是获取事件,如Event.includes(:subscription),在视图中可以使用e.subscription.size而不是count。我尝试过,它只获取更多数据,但不能解决订阅计数的n+1问题。我尝试过,它只会获取更多数据,但不会解决订阅计数的n+1问题。您的包含(:订阅)将不起作用,请参阅下面的注释。然而,关于使用计数器缓存的建议正是我想要的。你的包含(:订阅)不起作用,请参阅下面的评论。然而,关于使用计数器缓存的建议正是我想要的。