Ваш запрос не работает, потому что вы используете PostgreSQL (или некоторую подобную строгую базу данных), а ваш список SELECT не соответствует вашему GROUP BY. Все в вашем SELECT должно быть либо внутри агрегатной функции (например, COUNT
, AVG
, ...), либо должно появляться в вашем предложении GROUP BY; некоторые базы данных, такие как MySQL и SQLite, будут пытаться устранить неоднозначность, но другие базы данных, такие как PostgreSQL, не будут. Я предполагаю, что вы видите ошибку, похожую на:
ERROR: column "X" must appear in the GROUP BY clause or be used in an aggregate function
Вы, наверное, ищете что-то еще подобное:
@profile_views = ProfileView.where(:user_id => current_user.id)
.count(:group => :viewer_id)
Это даст вам простой хэш в @profile_views
, который отображает viewer_id
(включая nil
s) на количество просмотров.
Этот бит AR эквивалентен этому SQL:
select viewer_id, count(*)
from profile_views
where user_id = #{current_user.id}
group by viewer_id
Вы заметите, что все в SELECT находится либо в GROUP BY, либо в совокупности.
Вы не можете получить объекты ProfileView одновременно с подсчетом. Когда вы добавляете GROUP BY, вы свернете строки с одинаковым viewer_id
, и как только строки потеряют свою идентичность, у базы данных не будет возможности выбрать, какую строку следует использовать для создания экземпляра ProfileView.