2009-05-16 74 views
1

我正在Rails中開發一個應用程序,我希望根據用戶當前的要點對用戶列表進行排名。該表如下所示:user_id:string,points:integer。 因爲我無法弄清楚如何做到這一點「Rails的路」,我寫了下面的SQL代碼:ActiveRecord和SELECT AS SQL語句

self.find_by_sql ['SELECT t1.user_id, t1.points, COUNT(t2.points) as user_rank FROM registrations as t1, registrations as t2 WHERE t1.points <= t2.points OR (t1.points = t2.points AND t1.user_id = t2.user_id) GROUP BY t1.user_id, t1.points ORDER BY t1.points DESC, t1.user_id DESC'] 

事情是這樣的:訪問別名的列「user_rank」的唯一途徑是通過做排名[0] .user_rank,如果我想要輕鬆顯示結果表,讓我頭痛不已。

有更好的選擇嗎?

回答

1

怎麼樣:

@ranked_users = User.all :order => 'users.points' 

那麼在你看來,你可以說

<% @ranked_users.each_with_index do |user, index| %> 
    <%= "User ##{index}, #{user.name} with #{user.points} points %> 
<% end %> 

如果由於某種原因需要在數據庫中保留該數字索引,則需要添加一個after_save回調來更新用戶的完整列表,只要任何人有任何變化的點數。你可能會考慮使用acts_as_list插件來幫助解決這個問題,或者這可能是完全矯枉過正的。

0

嘗試添加user_rank到您的模型。

class User < ActiveRecord::Base 

    def rank 
    #determine rank based on self.points (switch statement returning a rank name?) 
    end 

end 

然後你就可以用@ user.rank訪問它。

0

如果你做的事:

SELECT t1.user_id, COUNT(t1.points) 
FROM registrations t1 
GROUP BY t1.user_id 
ORDER BY COUNT(t1.points) DESC 

如果你想獲得的所有軌道-Y,然後做

cool_users = self.find_by_sql ['(sql above)'] 

cool_users.each do |cool_user| 
    puts "#{cool_user[0]} scores #{cool_user[1]}" 
end