Использование group_by в rails / ruby - PullRequest
1 голос
/ 13 марта 2011

Вот мой массив:

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

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

Есть идеи, как мне это сделать?

Ответы [ 3 ]

6 голосов
/ 14 марта 2011

Вы пробовали метод 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 голосов
/ 14 марта 2011

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

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_id и отличается ли он от обычного id?

0 голосов
/ 14 марта 2011

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

vote_id
user_id
...

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

Vote.group(:user_id).count.max{|a, b| a.last <=> b.last}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...