Ruby on Rails activerecord находит среднее значение в одном sql и Will_Paginate - PullRequest
2 голосов
/ 28 марта 2010

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

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

Кроме того, как бы я использовал это с плагином Will_Paginate?

Спасибо

1 Ответ

1 голос
/ 29 марта 2010

Вам нужны опции :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 к своим аргументам

...