2011-03-01 65 views
1

我有一个分数表,每个用户都有分数和时间。我想计算两个用户分组的平均值。我可以成功计算其中的一个,但不知道如何一次执行这两个操作。ActiveRecord计算多个平均值

@scores = SpellingScore.where(:user_id => users).average(:score, :group => :user) 

会产生SQL像下面

SELECT AVG(`spelling_scores`.`score`) AS average_score, user_id AS user_id 
FROM `spelling_scores` 
WHERE (`spelling_scores`.`user_id` IN (78767, 78772, 78775)) GROUP BY user_id 

我知道如何做到这一点的SQL,但不能制定出ActiveRecord的方式。

这就是我想做的事......

SELECT AVG(`spelling_scores`.`score`) AS average_score, AVG(`spelling_scores`.`time`) AS average_time, user_id AS user_id 
FROM `spelling_scores` 
WHERE (`spelling_scores`.`user_id` IN (78767, 78772, 78775)) GROUP BY user_id 

干杯,

回答

0

只需使用SQL。忘记ActiveRecord的方式,SQL更适合这样的事情。如果你想保持你的模型的逻辑只是在你的模型中创建一个新的方法

+0

这是否意味着没有办法用ActiveRecord做测试吗?看起来像简单的事情。我想使用新的查询链接,因为我将添加更多来自搜索字段的条件。 – Tim 2011-03-01 01:08:13

4

感谢您的帮助Macarthy。

最后我做这种方式

SpellingScore.select("AVG(`spelling_scores`.`score`) AS average_score, 
AVG(`spelling_scores`.`time`) AS average_time, COUNT(*) AS question_count, user_id AS 
user_id").where(:user_id => users).group(:user_id).includes(:user).order('users.last') 

至少我保留了一些ActiveRecord的链接。

0

这是不是工作SpellingScore.group(:user).average(:score) 离不开架构虽然

+0

不,不幸的是这不起作用。 – DoubleMalt 2014-11-28 09:40:10