Подсчет и группировка одновременно - PullRequest
15 голосов
/ 01 февраля 2009

У меня есть модель Mail со следующей схемой:

t.string   "mail"
t.integer  "country"
t.boolean  "validated"
t.datetime "created_at"
t.datetime "updated_at"

И я хочу найти 5 лучших стран в базе данных, поэтому я продолжу и наберу

@top5 = Mail.find(:all,:group =>  'country',:conditions => [ "validated = ?" , "t" ], :limit => 5 )

Это скажет мне группы (мне нужен заказ, я не знаю, как писать)

@top5 = Mail.count(:all,:group =>  'country',:conditions => [ "validated = ?" , "t" ], :limit => 5 )

Это скажет мне, сколько писем в каждой группе

Мне интересно, смогу ли я сгруппироваться и сосчитать всего за один раз

Ответы [ 4 ]

24 голосов
/ 01 февраля 2009

Попробуйте:

Mail.count(:group => 'country', :conditions => ['validated = ?', 't'])

Я не уверен, что граф принимает :limit.

EDIT:

Я думаю, что это более читабельно:

Mail.count(:group => :country, :conditions => {:validated => true})

22 голосов
/ 08 мая 2012

С Rails 3 вы можете еще больше упростить его:

Mail.where(validated: true).count(group: :country)

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

Mail.where(validated: true)
    .order(:country)
    .count(group: :country)

Вы также можете заказать по количеству, используя "count_all":

Mail.where(validated: true)
    .order("count_all desc")
    .count(group: :country)

Вы также можете ограничить количество возвращаемых групп. Чтобы сделать это, вы должны позвонить по лимиту перед счетом звонка (поскольку #count возвращает ActiveSupport::OrderedHash):

Mail.where(validated: true)
    .order("count_all desc")
    .limit(5)
    .count(group: :country)

Обновлен синтаксис для Rails 4:

Mail.where(validated: true)
    .group(:country)
    .count
19 голосов
/ 01 февраля 2009
Mail.find(
    :all, 
    :select => 'count(*) count, country', 
    :group => 'country', 
    :conditions => ['validated = ?', 't' ], 
    :order => 'count DESC',
    :limit => 5)

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

0 голосов
/ 04 апреля 2017

Мне тоже пришлось сгруппировать данные с названием города и показать count количества строк для каждого города с определенным условием . Вот как я это сделал:

CityData.where(:status => 1).group(:city_name).count

Вывод этого был:

{:Mumbai => 10, :Dublin => 7, :SF => 9}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...