2012-04-03 9 views
1

私はポストモデルを持ち、has_many:comments、:as =>:commentable(ポリモフィック)を投稿します。私はすべての投稿を取り出すことができる方法を探していますし、その投稿にいくつのコメントが含まれているかを示すレコードに仮想属性を付けています。railsのselectクエリに仮想の "count"カラムを追加するにはどうしたらいいですか?

私はちょうど行うことができると考えていた

Post.select("posts.*, count(comments.id) as post_comments").joins(:comments) 

しかし、全体のデータベース内のすべてのコメントに設定post_commentsを持つ1つのレコードのみ、レコードに属するものだけでなくを返す...

答えて

3

私の問題は、あなたのcount(comments.id)は、結合されたテーブル全体に対して1つだけカウントすることだと思います。あなたは、ネストされたクエリでこの問題を回避することができます:

Post.select("posts.*, (SELECT count(comments.id) FROM comments WHERE comments.post_id=posts.id) AS post_comments") 

コメントテーブルは外側のクエリで使用されていないので、あなたは、このケースに参加する必要はありません。

+0

これは完璧です – nathanengineer

-1

投稿モデルで変数を使用します。第一に、私は何とか探している投稿を見つけようとします(希望するwicheverパラメータで見つけることができます、下にidパラメータを検索した例を示します)。

@post = Post.find(params[:id]) 

あなたが探していたポストを見つけたら、コメント番号を見つけることはpreety簡単で、

@comments = @post.comments.size 

...の線に沿って何かをしようと...ウィッヒは、整数を返します。

5

実際、あなたが欠けているのはグループ句です。サイトごとにグループ化する必要があります。それ以外の場合、count()集計はすべてのレコードを1つのレコードに集約します。

これを試してみてください:

Post.select("posts.*, count(comments.id) as post_comments") 
    .joins(:comments) 
    .group('posts.id') 
関連する問題