【问题标题】:Rails: Order Model by sum of stats in child model?Rails:按子模型中的统计信息总和对模型排序?
【发布时间】:2017-02-14 03:50:07
【问题描述】:

我有一个 Player 模型,一个 Player 模型有很多 PlayerStats。

如果我想获得球员的总进球数,我会使用:

@player.player_stats.sum(:goals)

如何使用 Player 模型检索控制器中进球最多的球员列表?

我在想这样的事情:

@players = Player.order(:goals).limit(7)

但我不能这样做,因为玩家没有直接的目标,它有许多包含目标的 PlayerStats。

注意:我使用的是 mySQL 数据库。

【问题讨论】:

    标签: mysql ruby-on-rails database associations


    【解决方案1】:

    我认为应该这样做:

    Player
      .joins(:player_stats)
      .group('player_stats.id')
      .order('SUM(player_stats.goals) DESC')
      .limit(7)
    

    您可以在您的情况下使用范围:

    class Player
      scope :by_goals, lambda {
        joins(:player_stats).group('players.id').order('SUM(player_stats.goals) DESC')
      }
    end
    

    在控制器中:

    Player.by_goals.limit(7)
    

    【讨论】:

    • 太棒了!谢谢!
    • 会的!我实际上只是在做更多的测试,看起来它在哈希中重复播放器。例如,进球最多和第二多的球员总是同一个球员实例。不知道为什么会这样,因为在前两个之后它工作正常。
    • 实际上并不总是前两个,只是再次运行它似乎并没有正确订购它们。目前有 6 个玩家,当我使用 limit(6) 时并不总是得到 6 个唯一的玩家。
    • 我将其更改为包含,并且在我正在遍历 @players 哈希的 show.html.er 中,我收到此错误:Mysql2::Error: Unknown column 'player_stats.id'在“组语句”中:SELECT players.* FROM players GROUP BY player_stats.id ORDER BY SUM(player_stats.goals) DESC
    • 当我在show.html.erb中循环时也产生了错误。这就是错误:Mysql2::Error: Expression #1 of ORDER BY 子句不在 SELECT 列表中,包含聚合函数;这与 DISTINCT 不兼容:SELECT DISTINCT players.* FROM players INNER JOIN player_stats ON player_stats.player_id = players.id GROUP BY player_stats.id ORDER BY SUM(player_stats.go ) DESC
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多