essayez ceci :
Character.find_by_sql("SELECT *, rank() OVER (ORDER BY points DESC) FROM characters")
il devrait vous renvoyer des objets de personnage avec un attribut de rang, comme documenté ici . Cependant, cela peut ne pas être indépendant de la base de données et a tendance à devenir désordonné si vous passez autour des objets.
une autre solution (coûteuse) consiste à ajouter une colonne de classement à votre table et à demander à un rappel de recalculer le classement de tous les enregistrements à l'aide de .order chaque fois qu'un enregistrement est enregistré ou détruit.
modifier :
une autre idée adaptée aux requêtes à enregistrement unique peut être vue ici