2009-09-30 2 views
3

에서 계산내가 다음 DataMapper의 자원을 가지고 말할 수 Datamapper

@posts = Posts.all(:order => :date.desc) 

그러나 나는 얼마나 많은 코멘트가 있는지에 따라 내림차순으로 정렬 된 모든 게시물을 표시하고 싶습니다. 내가 어떻게 그럴 수 있니?

SELECT posts.*, COUNT(comments.id) AS comments_count FROM posts 
JOIN comments ON posts.id = comments.post_id 
GROUP BY posts.id ORDER BY comments_count DESC 

는 지금까지 내가 아는 한,이 쿼리 클래스를 프로그래밍 할 수있는 일이 아니다 :

답변

1

성능상의 이유로 이것을 수행하는 좋은 방법은 게시물에 대한 comment_count 값을 캐싱하는 것입니다. 그러면 다음과 같이 : order => : comment_count_cache.desc와 같이 사용할 수있는 속성을 제공하게됩니다. 이는 Comment 모델에 대한 후속 생성 후크를 추가하여 쉽게 설정됩니다. 당신이 순서를 변경하려면, 당신은 마이너스 기호를 취할 수

@post = Post.all(:order => :date.desc).sort_by { |post| -post.comments.count } 

:

@post = Post.all(:order => :date.desc).sort_by { |post| post.comments.count } 

이 구문이 좋은 별도의 쿼리를 호출

1

는 당신이 생성 할 SQL이 있다고 생각합니다. 이 경우 SQL에 드롭하십시오.

2

당신은 양자 택일 sort_by 사용할 수 있습니다, 하지만 adamaig가 지적한 것처럼, 추가 SQL 쿼리를 추가하기 때문에 db의 주석 수를 캐싱하는 것보다 성능이 떨어질 수 있습니다.

관련 문제