Ответ 1
Mail.find( :all, :select => 'count(*) count, country', :group => 'country', :conditions => ['validated = ?', 't' ], :order => 'count DESC', :limit => 5)
Это должно дать вам записи, имеющие атрибут страны и атрибут count.
У меня есть модель 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 )
Это скажет мне, сколько писем в каждой группе
Мне интересно, могу ли я группировать и считать всего за один ход
Mail.find( :all, :select => 'count(*) count, country', :group => 'country', :conditions => ['validated = ?', 't' ], :order => 'count DESC', :limit => 5)
Это должно дать вам записи, имеющие атрибут страны и атрибут count.
Try:
Mail.count(:group => 'country', :conditions => ['validated = ?', 't'])
Я не уверен, что count принимает :limit
.
EDIT:
Я думаю, что это более читаемо:
Mail.count(:group => :country, :conditions => {:validated => true})
С 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
Мне также пришлось группировать данные с именем города и показывать count количество строк для каждого города с конкретным условием. Так вот как я это сделал:
CityData.where(:status => 1).group(:city_name).count
Результат этого:
{:Mumbai => 10, :Dublin => 7, :SF => 9}