2009-01-31 3 views
15

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

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

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

ответ

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

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

+0

правда следует использовать вместо 'т' – Swards

+1

@airportyh Rails API говорит, что ActiveRecord.find устарел (http://apidock.com/rails/ActiveRecord/Base/find/class). Вы знаете лучший способ сделать это на Rails 3? – dcarneiro

+1

@ Даниэль: Я думал об этом раньше, но внимательно смотрю: он говорит «переехал или устарел», и на самом деле он был перенесен в ActiveRecord :: FinderMethods # find. (Я считаю, что вы все еще должны позвонить Mail.find, чтобы получить доступ к этому методу в своем новом расположении.) – antinome

24

Try:

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

Я не уверен, что счетчик принимает :limit хотя.

EDIT:

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

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

+0

Чтобы использовать параметр ограничения, который вы должны выполнить: Mail.limit (10) .order ("count_all desc"). count (группа:: страна). Подобно тому, что предлагает тройник. Для указания условий я предлагаю использовать область действия модели или вариант где. – Hendrik

22

С 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 
0

я тоже должен был объединить данные с название города и показывая счет количества строк для каждого города с определенного состояния. Так вот как я сделал:

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

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

{:Mumbai => 10, :Dublin => 7, :SF => 9} 
Смежные вопросы