我目前正在建立一个NFL pick'em联赛网站。我有一个用户模型,一个游戏模型和一个连接表,用于捕获每个用户的个人选择。游戏模型有一个“结果”属性,其中包括“W”表示获胜,“L”表示丢失,“P”表示推(领带)。
我遇到了建立排名页面的问题。我目前在我的用户模型中有两种方法:
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) %>
这个部门给了我那个用户的胜率(#correct / total picks)。对于我的排名表,我显然希望获胜率下降。问题是排序的唯一解决方案似乎是使用.order方法,该方法通常需要一些属性已经存在于数据库中,然后您可以在控制器中调用它。
我也尝试将此胜利百分比属性添加到数据库中,但我似乎无法找到一个回调,它会在游戏结果更新时更新用户的分数。
是否可以选择在视图中计算的属性或将此赢额百分比添加到用户模型的方法?
提前致谢!
答案 0 :(得分:9)
为什么不在模型中而不是在视图中进行计算?添加另一种方法:
此代码包含在您的用户模型中:
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 %>