按循环中的值排序

时间:2016-04-04 12:15:23

标签: ruby-on-rails ruby

我试图存储FIFA游戏,并设置一个排名系统的记分牌。

我不应该在视图中使用逻辑,但是如果我在控制器中计算它们,它会呈现一个错误,即未指定方法用户。但是,当我将它放入循环中时,它会识别它,因为用户是循环项目。

该应用已经可以保存游戏并计算获胜者。该应用为每个游戏添加winner_idloser_id。稍后在记分板中,我会计算循环中当前user_id的所有游戏数与所有游戏相匹配的数量' winner_idloser_id&#39}。这使数据库保持清洁。我不想在数据库中保留输赢,因为当游戏被删除时,它不应该算作输赢了。

控制器:

class ScoreboardController < ApplicationController
    def index
        @users = User.all
    end
end

查看:

<div class="panel panel-default" style="margin-left: 10px; margin-right:10px">
  <!-- Default panel contents -->
  <div class="panel-heading">Scoreboard</div>

  <!-- Table -->
          <table class="table">
             <thead>
                 <th>#</th>
                 <th>Username</th>
                 <th>Ratio</th>
                 <th>Wins</th>
                 <th>Losses</th>
              </thead>

              <% @users.each do |user|%> 
                 <tbody> 

              <td>
               1 

              </td>

              <td>
                  <%= user.username %>
              </td>

                  <% if (Game.where(:winner_id => user.id).count) == 0 %>

                  <td>Unvalid</td>

                <% elsif (Game.where(:loser_id => user.id).count) == 0 %>

                     <td>Unvalid</td>

                     <% else %>   
                       <% @ratio =  (number_with_precision((((Game.where(:winner_id => user.id).count).to_f) / (Game.where(:loser_id => user.id).count).to_f), precision: 2))  %>

                     <td><%= @ratio %></td>


                     <% end %>

                <td>
                 <%= Game.where(:winner_id => user.id).count %>
              </td>
               <td>
                   <%= Game.where(:loser_id => user.id).count %>
              </td>


                     <% end %>
              </tbody>
          </table>

        </div>

我想按正确的顺序列出此列表。该列表应按比例排序。 =&GT;视图中的@ratio。我可以直接这样做吗?

在第一个td中,显示当前位置。它为每个用户显示1。如何制作123,...?

2 个答案:

答案 0 :(得分:4)

您应该在User模型中添加这些方法。

class User < ActiveRecord::Base
  has_many :wins, class_name: 'Game', foreign_key: 'winner_id'
  has_many :losses, class_name: 'Game', foreign_key: 'loser_id'

  def ratio
    wins.count / losses.count.to_f * 100
  end
end

然后在控制器中:

def index
    @users = User.all.sort_by(&:ratio)
end

并在视图中直接使用用户实例方法: <%= user.wins.count %>

答案 1 :(得分:1)

你应该像@ThomasHaratyk上面提到的那样做。

其他问题:在第一个td显示当前位置,现在它为每个用户显示1,我该如何制作这个1,2,3 ......?

<% @users.each_with_index do |user, index|%> 
   <tbody> 
      <td>
          <%= index + 1 %>
       </td>
<% end %>