Как сгруппировать результат запроса с активной записью? - PullRequest
1 голос
/ 10 марта 2012

У меня есть следующая модель:

ProfileViews (id, user_id, viewer_id)

Я пытаюсь вернуть все user_views, которые сгруппированы по viewer_id ... Обратите внимание, что viewer_id может иметь значение nil, что я хочу вернуть. Я могу сказать, просмотрели 20 раз ноль и т. Д.

Почему это не работает?

@profile_views = ProfileView.select('*').where(:user_id => current_user.id).group(:viewer_id)   

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Ваш запрос не работает, потому что вы используете 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.

0 голосов
/ 10 марта 2012

Я не думаю, что вы можете иметь select(*) в групповой выписке. Вы можете попробовать select count(viewer_id) или любую другую группу, для которой вы собираетесь.

Обновление

Вы можете увидеть больше примеров здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...