2017-06-14 76 views
0

是否可以連接兩個表並計算兩者的關係數?理想的輸出是 [name, recommendation_count, review_count]Rails has_many多次連接記錄數

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

第二個例子爲列

+0

你能提供有關您的模型/關係的細節? – archana

+0

@archana增加了更多關於模型的信息 – user2954587

+0

你的'has_many:through'關係在哪裏? – archana

回答

1

這應該返回'count(recommendations.id)'值:

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

我強烈建議開始學習SQL。 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 INNER JOIN' SQL子句,而現在你需要'LEFT OUTER JOIN'。 Rails 5+爲此擁有'.left_outer_joins'。 –