2012-02-29 16 views
6

私は投稿のモデルhas_manyのコメントを持っています。すべての投稿はスレッドIDを持ちます(ただし、Threadというモデルはありません)。アクティブレコード:グループでカウント

だから私はこの記事内のスレッドの数をカウントしたい場合、私は

> post.comments.count(:thread, :distinct => true) 
SELECT COUNT(DISTINCT "comments"."thread") FROM "comments" WHERE "comments"."post_id" = 3 

のようになめらかでくださいそして、これは正常に動作します。しかし、1つのコメントだけでスレッドの数を数えたいのですが?

> post.comments.group(:thread).having('COUNT(*) == 1').count 
SELECT COUNT(*) AS count_all, thread AS thread FROM "comments" WHERE "comments"."post_id" = 3 GROUP BY thread HAVING COUNT(*) == 1 ORDER BY id 

私はIntegerの代わりにOrderedHashを持っています。そして、私は不要なステップを行う必要があります

> post.comments.group(:thread).having('COUNT(*) == 1').count.count 

もっと良い解決策はありますか?

答えて

12

これは予想される動作です。

post.comments.group(:thread).having('COUNT(*) == 1').count 

これは、キーがスレッドIDで値がカウントであるハッシュを返します。私はこれが、あなたがレールで集約関数を持つグループを行うたびに当てはまると信じています。最初のクエリが一致する結果の数を取得するには、2番目のカウントを実行する必要があります。

私は、これはRailsの中でどのように見えるかわからないが、ここで私はあなたがしたいと思うSQLは次のとおりです。

SELECT COUNT(*) FROM 
    SELECT COUNT(*) AS count_all, thread AS thread 
    FROM "comments" 
    WHERE "comments"."post_id" = 3 
    GROUP BY thread 
    HAVING COUNT(*) == 1 
    ORDER BY id 
+0

一般的にSQLは「=」同値のために「==」ではない期待しています。あなたの答えはおそらく、いくつかのブランドのSQLでは正しいでしょうが、この変更がなければMySQLでは失敗します。 –

+0

それは正しいです。しかし、私は彼が元の投稿で使っていたフォーマットと一貫しているようにしていました。 – Brad

関連する問題