2010-12-16 4 views
1

를 필요한 가정하자 나는 다음과 같은 원형 적 모델이 : 블로그, 포스트, 코멘트, 종류를. 블로그 has_many 게시물, 게시물 has_many 의견 및 belongs_to 카테고리.액티브 그룹화가/카운트 쿼리 도움말 내가 레일</p> <p>3을 사용하고

각 범주에 몇 개의 게시물이 있지만 의견이있는 게시물 수만 알고 싶습니다.

다음 작업을 수행 할 경우

blog.posts.group("category_id").count 

--This 나에게 내가 필요로하지만, 물론 문제는 값이 댓글이없는 게시물을 포함 카운트가 무엇인지에 가까운있는 OrderedHash을 제공합니다.

내가 할 경우

blog.posts.group("category_id").joins("comments").count 

이 --This

나에게 해당 범주 (필자는이 그룹 전에 참여 넣을 경우이 같은 일을)의 게시물에 댓글 수를 제공합니다.

도움 주셔서 감사합니다.

답변

0

검색어를 간단하고 읽기 쉽게 유지하는 데 도움이되는 간단한 옵션은 게시물에 덧글 연결에 counter_cache을 설정하면 찾을 수 있도록 where("comments_count > 0")을 추가 할 수 있습니다.

+0

덕분에이 해킹 암시. 나는이 옵션으로 갈 것이라고 생각하지만 여전히 AR 방법의 조합이 있는지 궁금 할 것입니다. –

1

'시도'하는 것이 좋습니다. 그냥 .... 함께 신속하게 뭔가 등으로 번역 할

Post.select("posts.id, posts.category_id, count(comments.id)").join(:comments).group('posts.category_id').having('count(comments.id) > 0') 

...

select posts.id, posts.category_id, count(comments.id) from posts join comments on posts.id = comments.post_id group by posts.category_id having count(comments.id) > 0 

이 작은 비트를 반복해야 할 수도 있습니다 ...

+0

("join"을 "joins"으로 변경하여 컴파일합니다.) 그러면 각 카테고리에서 하나의 Post에 대한 Post id 및 Category id가 반환됩니다. –

+0

오른쪽 조인. 사과. 'count (comments.id) as foo'를 추가해야합니다. 그러면 반환 된 게시 객체에 foo가 설정되고 카테고리의 주석 수가 표시됩니다. 예 - 예를 들어 모든 게시물 주위에 프레임이 작성되었습니다. 블로그의 범위를 blog.posts로 지정합니다. – Cory