1

私は投稿モデルを持っており、投稿has_many:comments、:as =>:commentable(多態性)。すべての投稿をフェッチし、その投稿に属するコメントの数を表示する仮想属性をレコードに含める方法を探しています。

私はただできると思っていました:

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

ただし、これは1つのレコードのみを返し、post_commentsは、レコードに属するコメントだけでなく、データベース全体のすべてのコメントに設定されます。

4

3 に答える 3

6

実際、不足しているのはグループ句です。サイトごとにグループ化する必要があります。そうしないと、count()集計により、表示されているようにすべてが1つのレコードに折りたたまれます。

これを試して:

Post.select("posts.*, count(comments.id) as post_comments")
    .joins(:comments)
    .group('posts.id')
于 2012-08-16T11:46:11.510 に答える
3

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

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

この場合、コメントテーブルは外部クエリで使用されないため、結合は必要ありません。

于 2012-04-03T21:17:10.730 に答える
-1

Postモデルの変数を使用してこれを行います。最初に、私が探している投稿をなんとかして見つけようとします(必要なパラメーターで見つけることができます。以下に、idパラメーターを検索した例を示します)。

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

探していた投稿を見つけたら、コメント番号を見つけるのはとても簡単です。次のようなことを試してみてください...

@comments = @post.comments.size

...整数を返します。

于 2012-04-03T19:58:47.677 に答える