(使用rails 4)
我有一个Event
模型has_many
订阅。在事件列表中,我显示订阅的数量。为了我在每个事件的视图中执行此操作:
event.subscriptions.count
但是,这会导致性能下降,因为对于每个事件,都会执行后续查询以获取subscriptions
计数。
为了解决这个问题,我想要获得所有订阅,这些都是这样的:
subscription_count = Event.all.map { |e| {e.id => e.subscriptions.count} }
然后,我只是在event id
哈希中查找subscription_count
,而不是对每个事件执行查询。但是,这显然仍然分别执行所有查询。有没有办法执行一些聚合查询来一次完成工作?
谢谢!
答案 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