2010-12-18 3 views
1

나는 stackoverflow와 비슷한 순위 시스템이있는 웹 사이트를 만들고 있습니다. 특히, 질문은 upvoted 또는 downvoted 수 있습니다. 질문의 점수는 upvotes의 수에서 downvotes의 수를 뺀 값입니다. 내 응용 프로그램에서 투표 belongs_to : 질문 및 upvote 또는 downvote 여부를 결정하는 부울 : upvote 있습니다. 명명 된 범위를 점수순으로 정렬 할 수 있는지 궁금합니다.쿼리 결과를 투표 수 (연결)로 정렬

는 SQL에 해당 될 무언가 투표 FROM ((SELECT COUNT (*)로 질문 Q 순서와

SELECT *

같은 V1 WHERE v1.question_id = q.id 및 v1.upvote = TRUE) - (v2.x에서 v2.question_id = q.id 및 v2.upvote = false)를 선택하십시오.) DESC

그러나 이것을 레일스에 넣는 방법을 모르겠습니다. 어떤 아이디어?

감사합니다.

+0

부울 대신 투표 값 (+1 또는 -1)을 저장하는 것이 훨씬 쉬울 것입니다. 그러면이 필드를 합계 할 수 있습니다. – klew

+0

이것은 좋은 생각입니다, klew. 이 작업을 수행하면 명명 된 범위에서 어떻게 주문 작업을 수행 할 수 있습니까? – Vinay

+0

문제에 대한 해결책을 얻었습니까? 그렇다면 plz 또는 이메일을 보내주십시오. 여기 당신의 도움에 감사드립니다. 나는 같은 문제를 다루고있다. – Sumas

답변

0

ActiveRecord :: Base.connection.execute ([긴 쿼리는 여기]) 너무 거친 솔루션입니까? 즉 비록 다른 데이터베이스에 매우 휴대용 될 경우

+0

불행히도 너무 거칠다. 나는 여러 named_scopes를 함께 연결할 수 있어야합니다. – Vinay

0
Votes 
    scope :upvote, where("votes.upvote = ? ", true) 
    scope :downvote, where("votes.upvote = ? ", false) 

q.votes.upvote.count - q.votes.downvote.count 
+0

호기심에서 벗어났습니다 (저는이 게시물의 묻는 사람이 아닙니다). 그러나 각 범위의 카운터에 대해 counter_cache를 사용할 수 있습니까? 그러면 쿼리가 하나의 라이너가됩니다. –

+0

이것은 나에게 질문의 점수를 줄 것이다. 그러나 나는 그것을 필요로하지 않는다. 그래도 고마워 – Vinay

0

나는

scope :net_count, where("sum(decode(votes.upvote,true,1,false,-1))") 

확실하지를 사용하여 그 일의 오라클의 방법을 생각할 수있다.

루비/레일에서 할 수있는 좋은 방법이 많이 있지만, 순수하게 "하나의 범위"인 다른 것을 생각할 수 없습니다.

관련 문제