如何快速获取关联集合availables的总数量(替代循环求和)
快速获取关联availables集合总数量的方案
你提供的查询语句:
parents = Klass.order(id: :asc).where(availability_date: date).all.includes(:availables)
要直接统计所有关联availables的总数量,不用逐个遍历parent求和,有这几种高效方法:
1. 直接从关联模型查询(推荐,数据库层面统计)
这种方法无需加载任何Klass实例,直接通过关联条件让数据库计算总数,性能最优:
total_availables = Available.joins(:klass) .where(klasses: { availability_date: date }) .count
2. 基于已加载的parents集合处理
如果已经通过includes把所有关联的availables加载到内存中,用flat_map一次性提取所有记录后统计,比循环求和简洁高效:
total_availables = parents.flat_map(&:availables).size
3. 通过主模型关联查询统计
也可以在主模型的查询链中,结合left_joins和聚合函数直接计算总数:
total_availables = Klass.where(availability_date: date) .left_joins(:availables) .sum('COUNT(availables.id)')
补充说明
- 优先选择方案1,因为它仅查询统计数据,不会加载多余的模型实例,数据量较大时优势尤为明显。
- 方案2适合已获取
parents集合的场景,所有操作在内存中完成,无需额外数据库请求。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

