2017-12-14 19 views
0

프로젝트의 모든 방문수와 방문 방문 횟수 및 인식에 대한 쿼리를 작성하려고합니다. 어떤 이유로, 인식에 조인을 추가 할 때 잘못된 카운트가 발생합니다.레일스 left_outer_joins 여러 테이블로 계산

@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.fi @ ND (2)를 .maintenance_reports_count => 2 카운트 서브 쿼리로 수집하고 그 서브 쿼리 방문에 접합해야

+0

둘 다 생성 된 SQL을 표시 할 수 있습니까? – Shiko

답변

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