2012-05-05 4 views
3

У меня есть три модели User, и Grade.ActiveRecord :: Запрос к соединению для сгруппированных объектов

class User< ActiveRecord::Base 
    has_many :grades 
end 

class Subject < ActiveRecord::Base 
    has_many :grades 
end 

class Grade < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :subject 
end 

У пользователя может быть несколько оценок по одной теме.

На странице пользователя я хотел бы показать его оценку average и maximum по каждому предмету. Каков наилучший способ его достижения?

User: Qwerty 
Grades: 
------------------------------- 
subject  average maximum 
------------------------------- 
"subject_1" 56  97 
"subject_2" 45  85 

Насколько я знаю, ActiveRecord::Relation имеет специальные методы для maximum и average, но я не знаю, как получить ActiveRecord::Relation -объект для каждой группы сортов.

ответ

3

Я думаю, вам нужно что-то вроде:

user.grades.joins(:subject). 
    group(:subject_id). 
    select(['MAX(grades.grade) as max', 'AVG(grades.grade) as avg', subjects: :name]) 
+0

Спасибо за отличное решение! Кстати, похоже, что без '.joins (: subject)' запрос все еще работает правильно. – user1179942