2010-10-18 6 views
0

J'ai une déclaration MySQL qui m'a pris toute la nuit à venir avec. Je me demande si cette chose peut être converti d'un appel direct à quelque chose d'assez comme Object.find (: conditions)Déclaration MySQL convertir en jolie déclaration Rails AR?

ActiveRecord::Base.connection.execute(" 
    SELECT *, 
     (SELECT COUNT(*) 
     FROM scores AS temp2 
     WHERE temp2.score > scores.score 
     ORDER BY score DESC) + 1 AS rank 
    FROM scores 
    WHERE user_id=%s 
    ORDER BY score DESC" 
    % user_id).fetch_hash 

Cette déclaration fait partie d'un site score élevé construit pour un jeu Android. Il obtient le meilleur score et a une sous-requête qui lui donne aussi le rang.

Cela peut-il être amélioré? Aussi, est-ce la méthode la plus efficace pour y parvenir?

Merci, Justin

+0

Pouvez-vous décrire plus en détail ce que vous voulez faire et comment votre schéma va ensemble? Il est difficile de désosser le sql et votre description est un peu vague. –

+0

Il essaie de comprendre combien de scores sont plus élevés que le score d'un utilisateur donné .... Je pense que – Faisal

Répondre

1

Cela devrait le faire pour vous:

user = Score.find_by_user_id(id) 
rank = Score.count(:conditions => ['score > ?', user.score]) + 1 
+0

Merci Faisal, c'était préfet. –