2017-06-14 3 views
0

2つのテーブルを結合して両方の関係数を数えますか?Rails has_manyレコード数が複数のジョイン

PatientProfile 
    .joins(:recommendations, :reviews) 
    .group(:id) 
    .pluck(:name, 
     'count(distinct recommendations.id)', 
     'count(distinct reviews.id)') 

私は強くSQLを学習を開始することをお勧めしたい:理想的な出力は、第2の例では、これは動作するはず両方の列のための'count(recommendations.id)'

+0

は、あなたのモデル/関係についての詳細を提供することができますか? – archana

+0

@archanaモデルに関する詳細情報を追加しました – user2954587

+0

あなたの 'has_many:through'関係はどこですか? – archana

答えて

1

の値を返します [name, recommendation_count, review_count]

class PatientProfile 
    has_many :reviews 
    has_many :recommendations 

# this works 
PatientProfile.joins(:reviews).group(:id).pluck(:name, 'count(reviews.id)') 

# this does not work 
PatientProfile.joins(:recommendations, :reviews).group(:id).pluck(:name, 'count(recommendations.id)', 'count(reviews.id)') 

です。 ActiveRecordはマジックワンドではありませんが、SQLクエリを構築するためのツールです。さらに、ActiveRecordには独自の制限があります。したがって、アプリケーションでRDBMSを使用する場合、SQLはベースになります。

また、約counter_cachethereを読むと役立ちます。 count(...)のクエリを簡素化し、高速化します。

追加

あなたは推奨回数やレビューの数ですべてPatientProfilesだけでなく、それらの を含めるためにそれを微調整する方法を?

.joins今あなたがLEFT OUTER JOINを必要としながら、LEFT INNER JOIN SQL句を生成します。
Railsの5+:

PatientProfile 
    .left_joins(:recommendations, :reviews) 
    # ... 

Railsの< 5チート:

PatientProfile 
    .eager_load(:recommendations, :reviews) 
    # ... 
+0

ありがとう。これは素晴らしい。推奨数やレビュー数を持つ人だけでなく、すべての「PatientProfiles」を含めるにはどうすればよいでしょうか? – user2954587

+0

'.joins'は' LEFT OUTER JOIN'が必要な間に 'LEFT INNER JOIN' SQL節を生成します。 Rails 5+には '.left_outer_joins'があります。 –

関連する問題