sql - 在 Rails 中,给定一个 Point 对象数组,我如何对每个玩家的点值求和?

标签 sql ruby-on-rails ruby postgresql activerecord

我们正在为这个项目使用 postgres。

目标是获得一个散列,将每个玩家与他们的点值总和配对。

我有一个 Point 对象数组,看起来像这样:

(注意:这里的每个散列实际上是来自Points.where的数据库对象。数组实际上是一个ActiveRecord:Relation实例)

[
    { value: 3, player_id: 55 },
    { value: 1, player_id: 21 },
    { value: 2, player_id: 55 },
    { value: 6, player_id: 23 },
    { value: 2, player_id: 78 },
    { value: 2, player_id: 55 },
    { value: 5, player_id: 80 },
    { value: 7, player_id: 21 },
    { value: 2, player_id: 23 },
    { value: 1, player_id: 78 },
    { value: 4, player_id: 80 }
]

预期的输出是这样的:

{
    55: 7,
    21: 8,
    23: 8,
    78: 3,
    80: 9
}

其中key是player_id,value是他们所有积分值的总和。

我想出的一个 ruby​​ 解决方案使用 activerecord 对集合中每个 ID 的点求和。

points = get_the_points()

point_map = {}
ids = points.pluck(:player_id)

player_ids.each do |id|
    points_for_id = points.where(player_id: id).pluck(:value)
    sum_of_points = points_for_id.sum

    point_map[id] = sum_of_points
end

return point_map

但我知道这可以用 SQL 来完成,而且我知道它会更快。

因为我只处理一个模型,所以我不必使用连接或其他任何东西,对吗?

最佳答案

在一个 SQL 查询中尝试

Point.group(:player_id).sum(:value)

关于sql - 在 Rails 中,给定一个 Point 对象数组,我如何对每个玩家的点值求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44054304/

相关文章:

mysql - sql : select uppercase columns in database

php - 将长名称列表读入 mysql 并查询名称

sql - 不用聚合函数求最大值

ruby-on-rails - 如何编写这些资源的路由?

ruby-on-rails - 我应该在 Gemfile 中设置显式版本吗?

ruby - 正则表达式捕获 html 标签内的多个项目

ruby-on-rails - Rails,如何制作记录上次访问时间的数据库模型

mysql - 简单的 SELECT 查询对于 ~4Gb 表 (MariaDB) 来说很慢

ruby-on-rails - 使用 heroku 和 sidekiq 时,我将 ENV ["WEB_CONCURRENCY"] 设置为什么

ruby - `sort_by` 如何处理多个字段?