rails left_outer_joins计数多个表

时间:2017-12-14 19:10:27

标签: ruby-on-rails left-join active-record-query

我正在尝试进行查询以获取项目中的所有访问以及每次访问maintenance_reports和识别的计数。出于某种原因,当我将识别添加到连接时,我得到的计数不正确。

@visits = @project.visits.left_outer_joins(:maintenance_reports)
      .distinct
      .select(
        'visits.*, COUNT(maintenance_reports.*) AS maintenance_reports_count'
      )
      .group('visits.id')
      .order('id asc')

我得到了

  
    

@ visits.find(2).maintenance_reports_count     => 6

  
    @visits = @project.visits.left_outer_joins(:maintenance_reports, :recognitions)
      .distinct
      .select(
        'visits.*, COUNT(maintenance_reports.*) AS maintenance_reports_count, COUNT(recognitions.*) AS recognitions_count'
      )
      .group('visits.id')
      .order('id asc')
  
    

@ visits.find(2).maintenance_reports_count     => 2

  

1 个答案:

答案 0 :(得分:0)

需要将计数收集为子查询以及与访问相关联的子查询。

@visits = @project.visits
visit_ids = @visits.pluck(:id) # Used to limit count queries

# SQL to get MaintenanceReport and Recognition counts for these visits.
# Notice the where(visit_id: visit_ids) so we only count the relevant ones.
# This could be more DRY. Maybe a scope (:with_mr_counts) on Visit. 
mc_sql = MaintenanceReport.
  where(visit_id: visit_ids).
  group(:visit_id).
  select('visit_id, count(*) AS maintenance_report_count').
  to_sql
rc_sql = Recognition.
  where(visit_id: visit_ids).
  group(:visit_id).
  select('visit_id, count(*) AS recognition_count').
  to_sql

# Join the count queries with the visits
@visits = @visits.
  select('visits.*, maintenance_report_count, recognition_count').
  joins("LEFT JOIN (#{mc_sql}) t1 ON t1.visit_id = visits.id").
  joins("LEFT JOIN (#{rc_sql}) t2 ON t2.visit_id = visits.id").to_a
相关问题