9

私は現在、NFLのpick'emリーグサイトを構築しています。ユーザーモデル、ゲームモデル、および各ユーザーの個々の選択をキャプチャする結合テーブルがあります。ゲームモデルには、勝つための「W」、負けるための「L」、プッシュ(引き分け)のための「P」のいずれかで構成される「結果」属性があります。

順位表の作成で問題が発生しています。現在、ユーザーモデルには2つのメソッドがあります。

def correct_games
  self.games.where(result: "W").count 
end

def total_games
  self.games.where('result != ?', "P").count 
end

correct_gamesメソッドは、正しいユーザーの選択をカウントします。total_gamesメソッドは、ゲームの総数をカウントします(プッシュをもたらしたゲームはカウントしません)。

それから私の見解では、私は現在各ユーザーのために持っています:<%= number_to_percentage(current_user.correct_games.to_f / current_user.total_games) %>

この分割により、そのユーザーの勝率(#正解/合計ピック数)がわかります。私の順位表では、勝率の降順が必要です。この問題は、並べ替えの唯一の解決策は.orderメソッドを使用しているようです。このメソッドでは通常、何らかの属性がデータベースに既に存在している必要があり、コントローラーで呼び出すことができます。

この勝率属性をデータベースに追加しようとしましたが、ゲームの結果が更新されるたびにユーザーのスコアを更新するコールバックを理解できないようです。

ビューで計算された属性を並べ替える解決策、またはこの勝率をユーザーモデルに追加する方法はありますか?

前もって感謝します!

4

1 に答える 1

9

ビューではなくモデルで計算を実行しないのはなぜですか? 次のような別のメソッドを追加します。

このコードは User モデルに入ります:

def percentage_correct
  ((self.correct_games.to_f / self.total_games) * 100).to_i
end

def self.sorted_by_percentage_correct
  User.all.sort_by(&:percentage_correct).reverse
end

ビューでの使用方法は次のとおりです。

<% User.sorted_by_percentage_correct.each do |u| %>
  <div><%= u.name %> has pick percentage of <%= u.percentage_correct %>%</div>
<% end %>
于 2012-10-14T06:18:25.833 に答える