【问题标题】:How can I sort on a calculated value?如何对计算值进行排序?
【发布时间】:2012-10-14 03:25:58
【问题描述】:

我目前正在建立一个 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) %>

这个部门为我提供了该用户的胜率(# 正确/总选择)。对于我的积分榜,我显然想要按胜率降序排列。问题是排序的唯一解决方案似乎是使用 .order 方法,该方法通常需要一些属性已经在数据库中,然后您可以在控制器中调用。

我也尝试将这个胜率属性添加到数据库中,但我似乎无法找到一个回调来在游戏结果更新时更新用户的分数。

对视图中计算的属性进行排序或将此胜率添加到用户模型的方法的任何解决方案?

提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 sorting


    【解决方案1】:

    为什么不在模型中而不是在视图中进行计算?像这样添加另一个方法:

    此代码进入您的用户模型:

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

    【讨论】:

    • 我想我的问题更多的是如何对不在数据库中的值进行排序。我可以将该计算放入模型中,但我仍然不确定如何 (a) 对每个用户运行 percent_correct 计算,以及 (b) 在排名视图中根据该值对表格进行排序。
    • 这不是一个很好的解决方案,它可能适用于一张小桌子,但当你的桌子有很多行时,你不会想要加载“全部”。要使用数百万条记录解决这个问题,您可能应该在表中存储正确的滚动百分比,以便您可以直接排序。
    • @Corey :我认为它实际上并没有按照您对代码的期望进行加载。这适用于所有正常的过滤选项。例如User.named_scope.sorted_by_percentage_correct 只从数据库中拉取相关字段,然后对其进行排序。另一个例子可能是@group.users.sorted_by_percentage_correct 除非我遗漏了一些重要的东西,否则这似乎不会对内存或数据库造成任何额外的工作。
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2013-03-27
    相关资源
    最近更新 更多