2009-05-16 13 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