2012-04-16 78 views
0

我想根據當前收到的投票數得到activerecord對象的排名。在我的對象模型中,我有一個方法'排名'定義爲:獲取mysql中的條目的排名

Object.count(:conditions => ['votes > (?)', self.votes], :distinct => true) + 1 

返回排名。但是,在我的程序中的其他地方,我發現我實際上需要在mysql查詢本身中獲取它。我想嘗試做下面的事情:

Object.select('id, votes, (SELECT COUNT(DISTINCT "objects"."id") 
FROM "objects" 
WHERE "objects"."votes" > votes) AS rank').limit(10) 

但是,我不知道如何做'objects.votes> votes'部分。我需要替換「>票」,並提供一些參考。不知道這是否清楚。有任何想法嗎?

+0

它是否有助於提供這樣的SQL解決方案? – 2012-04-16 03:20:06

+0

當然會! – Marc 2012-04-16 04:32:16

回答

0

我猜你的意思是,你如何將self.votes從rails傳遞給SQL查詢?

你可以這樣做:

Object.where("votes > ?",self.votes) 

所以要通過self.votes到您的查詢:

Object.select('id, votes, (SELECT COUNT(DISTINCT "objects"."id") 
FROM "objects" 
WHERE "objects"."votes" > ?) AS rank',self.votes).limit(10) 
+0

也許我沒有解釋得很好。我在控制器中這樣做,所以沒有自我。我可能錯誤地接近了這一點。 – Marc 2012-04-16 04:27:09

+0

您需要一些東西來比較對象的投票。所以如果你有一個模型發佈,並且它有很多投票,你需要在投票中記錄得票最多的投票,然後當新的投票進來時,你可以比較新投票的數量和發佈的投票數量最受歡迎的投票記錄,然後確定排名。 – RadBrad 2012-04-16 04:58:10