Подтвердить что ты не робот

Одновременное подсчет и группировка

У меня есть модель 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 )

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

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

4b9b3361

Ответ 1

Mail.find(
    :all, 
    :select => 'count(*) count, country', 
    :group => 'country', 
    :conditions => ['validated = ?', 't' ], 
    :order => 'count DESC',
    :limit => 5)

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

Ответ 2

Try:

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

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

EDIT:

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

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

Ответ 3

С 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 (потому что #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

Ответ 4

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

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

Результат этого:

{:Mumbai => 10, :Dublin => 7, :SF => 9}