Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails n+;1用于计算a中的项目有多个关联_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails n+;1用于计算a中的项目有多个关联

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} } 然后,我不再对每个事件执行查询,而是

(使用rails 4)

我有一个
事件
模型,
有很多订阅。在事件列表中,我显示订阅数。在我看来,要在我参加的每一项活动中做到这一点:

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问题。您的包含(:订阅)将不起作用,请参阅下面的注释。然而,关于使用计数器缓存的建议正是我想要的。你的包含(:订阅)不起作用,请参阅下面的评论。然而,关于使用计数器缓存的建议正是我想要的。