2013-09-12 3 views
1

Привет У меня есть система ранжирования, в которой, если у них одинаковый балл или очки, то оба пользователя должны иметь одинаковый ранг.Если бы тот же рейтинг тогда тот же самый ранг в RAILS 3.2

Я получаю его через индекс, но не могу управлять, чтобы сделать их индексы оба равны, если они имеют одинаковое количество очков

user.rb

def get_rank 
    x = User.get_rank.index(self) 
    x ? (x + 1) : x 
end 

def self.get_rank 
    Response.joins(:answer).where("answers.correct is TRUE").map(&:user).uniq.sort_by(&:score).reject{|me| me.super_admin or me.questions.count < Question.count}.reverse 
end 

Как я могу сделать пользователь которые имеют одинаковые оценки, чтобы иметь только один аналогичный ранг.

E.g. если оба пользователя получают 25 очков, а 25 - самые высокие из сообщений, то они должны иметь первый ранг.

Любые обходные пути будут оценены

+0

Как насчет того, чтобы получить все баллы и получить индекс этой учетной записи? Однако это кажется довольно неэффективным. Например, вы показываете ранг 1000 пользователей, например. – j03w

+1

Радиус ранга находится в пределах диапазона, скажем, оценка от 0 до 100 - это ранг 1, от 100 до 500 ранга 2, бла-бла. Если ранг такой же, как и оценка, нет необходимости в ранжировании, достаточно использовать счет. –

+0

Итак, я должен реализовать диапазон? – xirukitepe

ответ

2

Вопрос довольно странно, но я думаю, что вы могли бы сделать лучше использовать функции базы данных. Возможно, что-то подобное работает, так как я не знаю ваших полных моделей, особенно у какого объекта есть оценка пользователя. Я предполагаю, что ИТС объекта пользователя:

def get_rank 
    scores = User.select(:score).joins(:response, :answers).where(:answers => [:correct => true]).order('score DESC').group(:score).all 
    # example result: [24, 22, 21, 20 ...] 
    rank = scores.index(score) + 1 
end 

В результате этого заявления дает упорядоченный массив все фактически применяется множество. Так как вы знаете текущий счет пользователя, вы можете получить индекс этого балла, который также является номером ранга.

+0

Спасибо, это помогло мне. Мне просто нужно было добавить карту перед индексом, чтобы заставить ее работать в моем случае. Итак, 'rank = scores.map (&: score) .index (self.score) + 1' – alskaa

Смежные вопросы