ActiveRecord вычисление нескольких средних - PullRequest
1 голос
/ 01 марта 2011

У меня есть таблица с оценками и временем для каждого пользователя. Я хочу рассчитать оба средних, сгруппированных по пользователю. Я могу успешно рассчитать один из них, но не уверен, как сделать оба сразу.

@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

Приветствия

Тим

Ответы [ 3 ]

4 голосов
/ 01 марта 2011

Спасибо за вашу помощь, Макарти.

В итоге я так и сделал

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 голосов
/ 19 февраля 2014

Не будет ли это работать SpellingScore.group(:user).average(:score) Не могу проверить это без схемы, хотя

0 голосов
/ 01 марта 2011

Просто используйте SQL.Забудьте об ActiveRecord, SQL лучше для чего-то подобного.Если вы хотите сохранить свою логику в своей модели, просто создайте новый метод в вашей модели

...