2015-06-21 3 views
1

У меня есть массив, который выглядит как этотсравнивающих значения индекса в массиве

ranking_array = ['NC', '40', '30/5', '30/4', '30/3', '30/2', '30/1', '30', '15/5', '15/4', '15/3', '15/2', '15/1', '15', '5/6', '4/6', '3/6', '2/6', '1/6', '0', '-2/6', '-4/6', '-15', '-30'] 

Я также пользователь модели, мой пользователь имеет рейтинг, который представляет собой значение, которое содержится в ranking_array.

У меня есть модельный турнир с max_ranking и min_ranking, которые оба значения содержатся в rank_array.

Пользователь может подписаться только на турнире, если

tournament.min_ranking<=user.ranking <= tournament.max_ranking 

Мне нужен способ, чтобы сравнить значение рейтинга (т.е. ranking_array индекса, поскольку ranking_array сортируется от самого низкого до самого высокого ранга)

Таким образом, мне нужно записать метод сравнения этих значений индексов:

if current_user.ranking_index > tournament.max_ranking_index 
    flash[:alert] = "Vous n'avez pas le classement requis pour vous inscrire dans ce tournoi" 
elsif current_user.ranking_index < tournament.min_ranking_index 
    flash[:alert] = "Vous n'avez pas le classement requis pour vous inscrire dans ce tournoi" 

Как я могу достичь этого с each_with_index?

+1

Непонятно, чего вы пытаетесь достичь. Как вы хотите использовать each_with_index в этом контексте? – nesiseka

+0

У меня есть rank_array, связанный со всеми моими рейтингами. Мой объект турнира имеет минимальный и максимальный рейтинг. Пользователь может подписаться только на турнир, если турнир.min_ranking <= user.ranking <= tournament.max_ranking. Мне нужен способ сравнить значение ранжирования (например, rank_array index, потому что rank_array сортируется от самого низкого до самого высокого рейтинга –

ответ

3

Я думаю, я понимаю, что вы пытаетесь достичь: Вы хотите, чтобы убедиться, что игрок имеет рейтинг между минимальным и максимальным рейтингом, но вы только сохранить рейтинг в каждой модели в виде строки. Ранжирующий массив имеет ранжирование в порядке возрастания, но я не уверен, что путь #each_with_index - это путь. Другой ответ чище. Вы также можете прочитать о встроенном enum классе Rails, который сделает его более понятным и понятным, когда читает его новый или внешний разработчик.

Ваш вопрос был о том, как это сделать с помощью each_with_index, но что-то вроде этого было бы тем, что вы хотите.

ranking_array.each_with_index do |ranking, i| 
    return i if ranking == current_user.ranking 
end 

Кроме того, оба оповещения мигают тем же сообщением. Если это преднамеренно, а не опечатка, вы можете объединить свои операторы if следующим образом:

if current_user.ranking_index > tournament.max_ranking_index || current_user.ranking_index < tournament.min_ranking_index 
    flash[:alert] = "Vous n'avez pas le classement requis pour vous inscrire dans ce tournoi" 
end 
+1

_Sidenote: _ 'if a> b || a mudasobwa

+0

Примечание [Диапазон # ===] (http://ruby-doc.org/core-2.2.0/Range.html# method-i-3D-3D-3D) совпадает с [Range # include?] (http://ruby-doc.org/core-2.2.0/Range.html#method-i-include-3F), который, если элементы диапазона являются числовыми, совпадает с [Обложка диапазона #?] (http://ruby-doc.org/core-2.2.0/Range.html#method-i-cover-3F) , –

2

Если вы хотите получить индексы ранжирования, просто вызовите .index на rank_array.

ranking_array.index(current_user.ranking) 
+0

спасибо, это хорошо –

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