ActiveRecord来自最后n行的平均值

时间:2014-01-04 04:56:18

标签: ruby activerecord sqlite

我正在尝试对activerecord查询中的列中的最后n行进行平均,如下所示:

Points.where(player_id: <player_id>).limit(5).average(:points)

但它给了我相同的答案,好像我把限制一样:

Points.where(player_id: <player_id>).average(:points)

如果我在没有.average(:points)的情况下进行测试,那么我只得到五行,但似乎平均值忽略了这一行。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

首先,您需要确保获得最后5个。

Points.where(player_id: <player_id>).order("created_at desc").limit(5)

然后将点弹出一个数组......

points = Points.where(player_id: <player_id>).order("created_at desc").limit(5).pluck(:points)

然后平均(如How do I create an average from a Ruby array?

points = Points.where(player_id: <player_id>).order("created_at desc").limit(5).pluck(:points)
ave    = points.reduce(:+).to_f / points.size

编辑:寻找没有积分的玩家,因为points.size等于零,结果将是NaN。

另一个编辑:在其他链接中进一步阅读,您可以简化:

points = Points.where(player_id: <player_id>).
                order("created_at desc").
                limit(5).
                pluck(:points).
                instance_eval { reduce(:+) / size.to_f }