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