tente isso:
Character.find_by_sql("SELECT *, rank() OVER (ORDER BY points DESC) FROM characters")
ele deve retornar objetos Character com um atributo de classificação, conforme documentado aqui . No entanto, isso pode não ser independente de banco de dados e tende a ficar confuso se você passar os objetos.
outra solução (cara) é adicionar uma coluna de classificação à sua tabela e ter um retorno de chamada para recalcular a classificação de todos os registros usando .order sempre que um registro for salvo ou destruído.
editar:
outra ideia adequada para consultas de registro único pode ser vista aqui