同时计数和分组

时间:2009-01-31 23:07:32

标签: ruby-on-rails

我有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 个答案:

答案 0 :(得分:24)

尝试:

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

我不确定伯爵是否接受:limit

修改

我认为这更具可读性:

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

答案 1 :(得分: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之前调用limit(因为#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

答案 2 :(得分:19)

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

这应该为您提供具有country属性和count属性的记录。

答案 3 :(得分:0)

我也必须使用城市名称对数据进行分组,并显示计数 特定条件的每个城市的行数。所以我就这样做了:

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

这的输出是:

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