2011-03-13 4 views
0

Вот мой массив:Использование group_by в рельсах/рубин

finalcount = Vote.where(:month => month, :year => year, :vote_id => vote.id).count 

Я хотел бы использовать group_by (я думаю?) Сгруппировать голоса по user_id (который имеет каждый голос), а затем вернуть user_id с наивысшим рейтингом.

Любые идеи, как я могу это сделать?

ответ

3

Вы пробовали метод group?

finalcount = Vote.where(:month => month, :year => year, :vote_id => vote.id).group(:user_id).count 

даст вам Hash где ключи к user_id и значения в count. Затем вы можете вызвать max по этому результату, чтобы получить двухэлементный массив, содержащий user_id и count.

Вот пример из приложения я имею под рукой, где я использую результат вычисления, чтобы найти правильный экземпляр модели и читать свойства из него:

ruby-1.9.2-p136 :001 > ExternalPost.group(:service_id).count 
=> {18=>1, 19=>1, 21=>4} 
ruby-1.9.2-p136 :002 > ExternalPost.group(:service_id).count.max 
=> [21, 4] 
ruby-1.9.2-p136 :003 > Service.find(ExternalPost.group(:service_id).count.max.first).user.first 
=> "Brandon" 
0

Если ваша структура таблицы как:

vote_id 
user_id 
... 

Это должно возвращать массив, в котором первым элементом является user_id с наибольшим количеством голосов, второй элемент - это счетчик user_id.

Vote.group(:user_id).count.max{|a, b| a.last <=> b.last} 
+0

Если вам не нужны другие записи из Vote (они не будут их использовать), то это очень неэффективный способ сделать это. Лучшим способом было бы захватить одну строку из базы данных, которая содержит правильный user_id и их счет (см. Мой ответ). – nzifnab

0

Я думаю, что вы действительно хотите это:

Vote.select("votes.user_id, count(votes.id)"). 
    where(:month => month, :year => year, :id => vote.id). 
    group("votes.user_id"). 
    order("count(votes.id) DESC"). 
    limit(1) 

Это будет захватывать user_id и подсчет голосов, которые они имеют, но только возвращают один с наибольшим количеством голосов.

Почему у вашего собеседника по-своему всего :vote_id => vote.id? У вашей модели Vote действительно есть столбец с именем vote_id и отличается ли он от обычного id?

Смежные вопросы