2014-01-15 5 views
1

Скажем, у меня есть таблица Users, и у каждого пользователя есть страна_ид (список стран хранится в другой таблице).Получение количества жителей в каждой стране

Я хочу, чтобы отобразить список каждой страны и сколько членов она имеет, то есть:

Canada: 16 
Romania: 12 
USA: 9 

Я использовал некоторый сырой SQL, но переход к Postgres был грязным, поэтому я хотел бы используйте более чистую реализацию. Есть ли хороший «рельсовый» способ получить список?

+0

пожалуйста, поделитесь, что вы пытались, вместе с таблицей схемы – Cris

+0

ActiveRecord методов группы и подсчета должны быть все, что вам нужно здесь. –

+0

То, что у меня есть, довольно вовлечено (и, вероятно, слишком сложно), поэтому я хотел бы просто пойти с первого этажа здесь. Я уверен, что это довольно распространенный тип запросов, поэтому я хотел бы получить любой совет! Вы можете представить, что схема таблицы представляет собой таблицу пользователя с идентификатором, именем и столбцом country_id и таблицей Country с идентификатором и именем. – opticon

ответ

5

Это должен возвращать хэш с country_id => count парами:

@users_by_country = User.group(:country_id).count 
#=> { 1 => 104, 2 => 63, ... } 

Сгенерированный SQL-запрос выглядит следующим образом:

SELECT COUNT(*) AS count_all, country_id AS country_id FROM `users` GROUP BY country_id 

А на ваш взгляд:

<% @countries.each do |country| %> 
    <%= country.name %>: <%= @users_by_country[country.id] %> 
<% end> 
2

хотя у вас есть не предоставлены какие-либо детали. поэтому его трудно ответить exaclty, но может быть это поможет

User.group(:country_id).count 
+1

Определенно. @Stefan избил вас на минуту, поэтому я должен дать ему чек, но вы получите upvote и мою вечную благодарность! – opticon

0

Если у вас есть модель, страна, и вы хотите сделать это немного по-другому, так что читает более человек, вы можете использовать .map.

Countries.map {| o | {Страна: o.name, участники: o.members.count}}

Очевидно, что вам необходимо иметь ассоциации. Если страны - это просто поле пользователя, это не сработает.

BR

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