2016-02-19 2 views
1

В моем табло контроллера, я устанавливаю заказ, и я стек ранжирование результатов по score:Присвоить действие в Rails на основе ранга в Порядке

@Quizzes = Quiz.where(finished: true, category: session[:category]).order(score: :desc).limit(10) 

Это возвращает таблицу топ-10 приводит к таблице. Теперь я хочу поставить сообщение рядом с результатом первого места (верхний рейтинг) и другое сообщение для остальных результатов. Так что я попытался создать если/другое с помощью first!:

<% if Quiz.where(category: session[:category]).first! %> 
    <td>You win</td> 
    <% else %> 
    <td>You lose</td> 
    <% end %> 

Это действительно добавляет «Вы выиграли» с точки зрения, но он делает это для конечного результата (# 10) и else сообщение не отображается вообще. Я попытался переключить его на .last, но то же самое произошло.

Предполагая, что вы можете использовать .order в качестве способа выбора результата, как мне его адаптировать?

UPDATE

Добавление полного кода для рендеринга таблицы оценки:

<% @quizzes do |quiz| %> 
    <tr> 
    <td></td> 
    <td><%= quiz.user.username %></td> 
    <td><%= quiz.user.city %></td> 
    <td><%= quiz.category %></td> 
    <td><%= quiz.score %></td> 
    <% end %> 

    <% @quizzes.each_with_index do |quiz, index| %> 
    <% if index == 10 %> 
     <td>You Win</td> 
    <% else %> 
     <td>You lose</td> 
    <% end %> 
    <% end %> 
</tr> 
+0

почему не использовать '.each' для перебирать их? –

+0

В настоящее время я использую '.each' для повторения результатов в таблице. Так что в настоящее время у меня будет таблица, показывающая результаты 1-10 на основе оценки (что вы видите в контроллере). Для строки с верхним рейтингом я хочу показать специальное сообщение в качестве последнего столбца. Для остальных 9 результатов я также хочу показать другое сообщение. Моя вера в '.each' заключается в том, что она не могла позволить мне настраиваться так. Я ошибаюсь? – darkginger

ответ

3

Это то, что вы должны сделать:

<% @quizzes.each_with_index do |quiz, index| %> 
    <tr> 
    <td></td> 
    <td><%= quiz.user.username %></td> 
    <td><%= quiz.user.city %></td> 
    <td><%= quiz.category %></td> 
    <td><%= quiz.score %></td> 
    <% if index == 0 %> 
     <td>You Win</td> 
    <% else %> 
     <td>You lose</td> 
    <% end %> 
    </tr> 
<% end %> 
+0

Это имеет смысл для меня логически, но оно добавляет все сообщения в последней строке снова (как и раньше) и фактически помещает все сообщения в одну и ту же строку (так что сообщение победителя следует за 9 неудачными сообщениями). Изменение его на 'if index == 10' не меняет результат, поэтому я не думаю, что он запрашивает индекс прямо сейчас. – darkginger

+0

Похоже, проблема связана с html. Можете ли вы опубликовать это в своем вопросе? – Spacepotato

+0

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

0

Попробуйте что-то вроде этого:

<% @Quiz.each do |quiz| %> 
    <% if quiz == @Quiz.first %> 
    <td>You win</td> 
    <% else %> 
    <td>You win</td> 
    <% end %> 
<% end %> 

Как .first возвращает первый объект коллекции, не является ли объект первым объектом. При этом вы также можете:

<% @Quiz.each_with_index do |quiz, index| %> 

И только проверьте, является ли index == 0, чтобы определить, является ли это первым объектом.

0

Предполагая, что у вас есть десять баллов в @top_ten = Quiz.where(finished: true, category: session[:category]).order(score: :desc).limit(10)

Вы можете сделать следующее:

<% @top_ten.each_with_index do |quiz, index| %> 
    <% if index == 0 %> 
     <td>You Win</td> 
    <% else %> 
     <td>You lose</td> 
    <% end %> 
<% end %>