2017-12-14 12 views
0

私はプロジェクト内のすべての訪問を取得するためのクエリを作成し、それぞれの訪問のカウント数maintenance_reportsと認識を試みています。なんらかの理由で、認識に結合を追加すると、カウントが正しくありません。rails 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.fi @

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') 

を取得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 
関連する問題