Активная запись Ruby on Rails находит среднее значение в одном sql и Will_Paginate

У меня есть следующая модельная ассоциация: модель студента и оценки has_many.

Мне нужно составить список с их именами и средними, минимальными, максимальными баллами. Пока я использую student.scores.average(:score) для каждого ученика и понимаю, что он выполняет один sql для каждого ученика. Как я могу сделать список с одним объединенным sql?

И как мне использовать это с плагином Will_Paginate?

Спасибо


person Darkerstar    schedule 28.03.2010    source источник


Ответы (1)


Вам нужны параметры :group и :select для Student.find. Это должно сработать для вас:

students = Student.all(
  :select => "
    students.*,
    AVG(scores.score) as avg_score,
    MIN(scores.score) as min_score,
    MAX(scores.score) as max_score",
  :joins => :scores
  :group => 'students.id')

Вычисляемые столбцы доступны так же, как и реальные столбцы, хотя они, очевидно, не будут сохранены.

students.first.avg_score
students.first.min_score
students.first.max_score

Для использования WillPaginate просто укажите параметры :page, :per_page, ... и вызовите Student.paginate вместо find. Если окажется, что пагинация получает неправильное количество страниц из-за опции :group, просто добавьте это: :total_entries => Student.count к вашим аргументам

person Daniel Beardsley    schedule 29.03.2010