2011-02-10 4 views
3

내가 대부분의 의견으로 주문 게시물을 얻을 수있는 액티브 쿼리를 할 수 있나요 많은 Comments활성 레코드에있는 연관의 수로 주문할 수 있습니까?

Posts가 있다고 가정하자?

나는이 오래된 쿼리에서이 비교적 일반적인 쿼리가 놀랍다. MySQL은 AR에서 쉽게 대답하는 것처럼 보이지 않는다. 예, counter_cache를 사용할 수는 있지만 원래 쿼리를 실제로 다시 생성하지는 않습니다.

무엇이 누락 되었습니까?

한 걸음 더 나아가십시오. PostsComments이 많고 Likes이 많으면 어떻게 될까요? 가장 많은 점수를 가진 게시물을 집계 할 수 있습니까?

감사합니다!

답변

1

당신이 말했듯이, counter_cache가 "레일 방식"에 가장 가깝습니다. 지금까지이 특정 목적에 대한 AR 정의 된 메소드가 발생하지 않은 그러나 이것은 내가 본 것을 그것에 가장 가까운 일이 다음 count_comments 속성을 포함하는 사용자 정의를 선택

@posts = Post.select("posts.*, COUNT(comments.id) AS count_comments").joins("LEFT OUTER JOIN comments ON posts.id = comments.post_id").group("posts.id").order("count_comments DESC") 

@posts.each do |post| 
    puts "Comments: #{post.count_comments}" 
end 

. include가 포함되지 않기 때문에 조인은 select 구문을 무시합니다. 사용자 정의는 단순히 주석 대신 구문을 결합합니다. 그렇지 않으면 주석이없는 게시물을 검색하지 못하게하는 내부 조인이 될 것이기 때문에 주석을 조인합니다.

은 기본적으로 자신을 구문 전체 SQL을 쓰고,하지만 여전히 ... 그것은 작동합니다 :)

+0

네, 그게 유일한 해결책이라고 생각합니다. 모든 커스텀 SQL은 정말 칙칙합니다. 언젠가는 이것을 능동적 인 레코드로하기 위해 더 깨끗한 방법을 추가한다면 흥미로울 것입니다. –

+0

AREL이 요즘 제공하는 기능을 감안할 때, 간단한 쿼리에 raw SQL을 사용하는 것이 좋습니다. 나에게 매우 비현실적 인 것처럼 보입니다. –

0

당신은뿐만 아니라 당신이 원하는 경우 같은 것을 할 수 있습니다 확신 :

posts = Post.find(:all, :include => 'comments') 
posts.sort { |a,b| b.comments.count <=> a.comments.count } 
+0

루비에서하는 작업은 실제로 테이블에 1,000 개 이하의 레코드가있는 경우에만 작동하므로 이보다 큰 테이블에는 사용할 수 없습니다. –

+0

예. – 2potatocakes

0

내가 supose arel ::

comments= Comment.arel_table 
posts= Post.joins(:comments).order(comments[:id].count) 

그러나 이것이 올바른 방법인지는 확실하지 않습니다. 혼자서 시도해야합니다.

관련 문제