2016-05-31 14 views
0

Gegeben eine ActiveRecord::Relation Instanz von Marathon-Teilnehmern mit ihren jeweiligen Zielzeiten. Wie ermittle ich Positionen (d. H. Ersten, zweiten, dritten) von zwei oder mehr Teilnehmern, die genau zur gleichen Zeit fertig sind? Zum Beispiel:So manipulieren Sie Array's Index

@runners = Runners.where (maranthon_year_id: 2016 Ort: 'fragen') bestellen. (Finish_time: asc)

Normalerweise würde ich durch diese angesichts iterieren dies wie:

<% 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 %> 

aber die oben funktioniert nicht, wenn zwei oder mehr Benutzer genau rechtzeitig fertig.

Dies ist die gewünschte Ausgabe:

enter image description here

Beachten Sie, dass Eyal Position ist 4th (nicht 3rd), weil zwei Teilnehmer zweite kam.

Antwort

0

@Ilya eine gute Idee hat, die Ergebnisse mit Gruppierung, aber diese Lösung nicht 3. Platz im Beispiel überspringen. Wir brauchen eine andere Variable, um den Überblick zu behalten.

<% 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

Meinen Sie "@ runner.each" anstelle von "luners" in Zeile 4? Ich habe '@ luners.each' probiert und es hat die Positionen gut übersprungen (Danke!), Aber es hat eine doppelte Schleife ausgeführt, also habe ich eine Wiederholung - 8 Zeilen statt 4 Zeilen. Ich habe meine Frage bearbeitet, um die Tabellenzeilen hinzuzufügen, da dies Ihre Antwort beeinflusst haben könnte. Danke noch einmal. –

+0

Ich glaube, ich habe die activerecord 'group' Methode nicht korrekt verwendet. Ich habe die Ergebnisse genommen und sie mit group_by gruppiert - das sollte jetzt mit 'runners' funktionieren (nicht' @ runners') –

+0

Schön. Das hat funktioniert, ich hätte eine Weile gebraucht, um das herauszufinden. Ich danke dir sehr. –

0

Dies sollte den Trick:

<% 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

Da Zählung auf 0 initialisiert wird, <% = count.ordinalize%> druckt 0. Für den ersten Lauf, Versuch der Initialisierung auf 1 zu ändern, um die, wenn die Bedingung geändert. –

Verwandte Themen