prova questo:
Character.find_by_sql("SELECT *, rank() OVER (ORDER BY points DESC) FROM characters")
dovrebbe restituirti oggetti Personaggio con un attributo rank, come documentato qui . Tuttavia, questo potrebbe non essere indipendente dal database e tende a creare confusione se si passano gli oggetti.
un'altra soluzione (costosa) consiste nell'aggiungere una colonna di rango alla tabella e fare in modo che un callback ricalcoli il rango di tutti i record utilizzando .order ogni volta che un record viene salvato o distrutto.
modifica :
un'altra idea adatta per query su record singolo può essere vista qui