2009-05-16 7 views
1

Je développe dans Rails une application dans laquelle je souhaite classer une liste d'utilisateurs en fonction de leurs points actuels. La table ressemble à ceci: user_id: string, points: integer. Puisque je ne peux pas comprendre comment faire « The Rails Way », j'ai écrit le code SQL suivant:Instructions ActiveRecord et 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'] 

La chose est la suivante: la seule façon d'accéder à la colonne crénelage « user_rank » est en faisant le classement [0] .user_rank, qui me brouille beaucoup de maux de tête si je voulais afficher facilement la table résultante.

Existe-t-il une meilleure option?

Répondre

1

Que diriez-vous:

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

alors à votre avis vous peut dire

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

Si, pour une raison quelconque, vous devez conserver cet index numérique dans la base de données, vous devez ajouter un rappel after_save pour mettre à jour la liste complète des utilisateurs chaque fois que le nombre de points a changé. Vous pourriez envisager d'utiliser le plugin acts_as_list pour vous aider, ou cela pourrait être une surpuissance totale.

0

Essayez d'ajouter user_rank à votre modèle.

class User < ActiveRecord::Base 

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

end 

Ensuite, vous pouvez y accéder avec @ user.rank.

0

Que faire si vous avez fait:

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

Si vous souhaitez obtenir tous les rails-y, puis faites

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

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