Во-первых, пара моментов, касающихся стилей и функций, которые помогут вам в построении запросов к БД.
1) Вы лучше пишете это как область, а не метод, т.е.
scope attendance_counts, select("users.*, sum(attended) as attendance_count").joins(:registrations).group('registrations.user_id').order('attendance_count DESC')
2) Лучше не вызывать все / find / first для созданного вами запроса, пока он вам действительно не понадобится (т.е. в контроллере или представлении). Таким образом, если вы решите внедрить кеширование действия / фрагмента позже, запрос к БД не будет вызван, если кешированное действие / фрагмент передан пользователю.
3) В Rails есть ряд функций, помогающих собирать данные в БД. например, если вам нужен только идентификатор пользователя и сумма посещенных вами, вы можете использовать что-то вроде следующего кода:
Registrations.group(:user_id).sum(:attended)
Другие функции включают count
, avg
, minimum
, maximum
Наконец, в ответ на ваш вопрос, rails создаст для вас атрибут для доступа к значению любых настраиваемых полей, которые есть в выбранной части вашего запроса. например,
@users = User.attendance_counts
@users[0].attendance_count # The attendance count for the first user returned by the query