2016-05-31 3 views
0

Учитывая пример участников марафона ActiveRecord::Relation со своим соответствующим временем окончания. Как определить позиции (то есть сначала, второе, третье) из двух или более участников, которые закончились точно в одно и то же время? Например:Как манипулировать индексом массива

@runners = Runners.where (maranthon_year_id: 2016, место жительства: 'спросить') заказ. (Finish_time:: по возрастанию)

Нормально, я бы перебирать это в виду например:

<% count = 0 %> 
    <% if @runners.each do |runner| %> 
    <tr> 
    <td><%= runner.id %></td> 
    <td><%= runner.name %></td> 
    <td><%= runner.finish_time %></td> 
    <td><%= (count += 1).ordinalize %></td> 
    </tr> 
    <% end.empty? %> 
    <tr> 
    <td colspan="4"> No Record Found</td> 
    </tr> 
    <% end %> 

но вышеописанное не работает, если два или более пользователя закончили точно.

Это желаемый результат:

enter image description here

Обратите внимание, что позиция Эяль является 4th (не 3rd), потому что двое участников пришли второй.

ответ

0

@Ilya имеет хорошее представление с группировкой результатов, но это решение не будет пропускать 3-е место в примере. Нам нужна другая переменная, чтобы отслеживать место.

<% count = 1 %> 
<% @runners.group_by(&:finish_time).each do |(time, runners)| %> 
    <% place = count %> 
    <% runners.each do |r| %> 
    <tr> 
     <td><%= r.id %></td> 
     <td><%= r.name %></td> 
     <td><%= time %></td> 
     <td><%= place.ordinalize %></td> 
    </tr> 
    <% count += 1 %> 
    <% end %> 
<% end %> 
+0

Вы имели в виду «@ runners.each» вместо runners.each в строке 4? Я попробовал «@ runners.each», и он отлично пропустил позиции (спасибо!), Но он выполнил двойной цикл, поэтому у меня есть повторение - 8 строк вместо 4 строк. Я редактировал свой вопрос, чтобы добавить строки таблицы, поскольку это могло повлиять на ваш ответ? Еще раз спасибо. –

+0

Я думаю, что я не использовал метод activerecord 'group' правильно. Я взял результаты и сгруппировал их с group_by вместо этого - теперь это должно работать с 'runners' (не' @ runners') –

+0

Nice. Это сработало, потребовалось некоторое время, чтобы понять это сам. Огромное спасибо. –

0

Это должно сделать трюк:

<% count = 0 %> 
<% @runners.each do |runner| %> 
    <td>runner.id</td> 
    <td>runner.name</td> 
    <td>runner.finish_time</td> 
    <% if runner.finish_time == @runners[count].finish_time %> 
    <td><%= count.ordinalize %></td> 
    <% count += 1 %> 
    <% else %> 
    <td><%= (count += 1).ordinalize %></td> 
    <% end %> 
<% end %> 
+0

Так как счетчик инициализируется в 0, <% = count.ordinalize%> печатает 0th для первого запуска, попытка изменить инициализации 1 изменили, если условие. –

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