2010-12-18 12 views
1

私は、stackoverflowと同様のランキングシステムを持つウェブサイトを作っています。具体的には、質問をアップまたはダウンすることができます。質問のスコアは、アップボートの数からダウンボートの数を差し引いた数です。私のアプリケーションでは、Vote belongs_to:questionには、upv​​oteかdownvoteかを判断するブール値:upvoteがあります。私はスコアでソートする名前付きスコープを作ることができるかどうか疑問に思っていました。クエリ結果を投票数でソートする(関連付け)

SQL同等物は、((SELECT COUNT(*)FROM投票V1 WHERE v1.question_id = q.id AND v1.upvote =真)BY質問Q オーダーから

SELECT * ようなものになるだろう - DESC

しかし、これをRailsに入れる方法がわかりません。何か案は?

ありがとうございます!

+0

ブールの代わりに投票値(+1または-1)を保存すると、このフィールドを合計するだけで簡単にできます。 – klew

+0

これはいいアイデアです、klew。私がこれをした場合、どのように名前付きスコープで注文作業を行うのですか? – Vinay

+0

あなたの問題のための解決策を得ましたか?本当にあなたの助けに感謝します。私は同じ問題に取り組んでいます。 – 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を付けることができましたか?そうすれば、クエリは1つのライナーになります。 –

+0

これは私に質問のスコアを与えますが、それは注文しません。これは必要なものです。ありがとう – Vinay

0

は私が

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

わからないを使用してそれをやってのオラクルの方法を考えることができます。

しかし、ルビー/レールでそれを行うには良い方法がたくさんありますが、純粋に "1つの範囲"である他のものは考えられません。

関連する問題