如何计算ActiveRecord .group查询的结果?链接.count返回一个哈希值

时间:2012-09-05 14:33:10

标签: ruby-on-rails activerecord

我可以使用以下内容:

User.where("zip_code = '48104'").group('users.id').count

获得像:

这样的哈希
{195=>1, 106=>1, 120=>1, 227=>1, 247=>1, 264=>1, 410=>1}

我有没有办法计算这些哈希值,只返回 7 ,而不是上述结果?

我知道在上面的场景中这没有意义,我可以通过不使用子句来实现。但是我正在研究一个更复杂的查询,我需要实现它。提前谢谢。

6 个答案:

答案 0 :(得分:20)

尝试:

User.where("zip_code = '48104'").group('users.id').count.length

答案 1 :(得分:9)

接受的答案不具备可扩展性。在具有25,000个匹配用户的查询上使用@ robbrit的方法将25,000个结果(即具有25,000个元素的数组)拉入内存,然后计算元素数组。这是一种方法,可以在不拉动所有数据的情况下完成:

def count_query(query)
  query = "SELECT count(*) AS count_all FROM (#{query.to_sql}) x"
  ActiveRecord::Base.connection.execute(query).first.try(:[], 0).to_i
end

它的用法如下:

query = User.where("zip_code = '48104'").group('users.id')
count = count_query(query)

这适用于我使用mysql,btw。

受到这个人的启发:https://github.com/mrbrdo/active_record_group_count/blob/master/lib/active_record_group_count/scope.rb

答案 2 :(得分:4)

如果要将哈希值加在一起,那么:

{key1: 1, key2: 2}.values.inject(:+) # => 3

如果您只想要按键数量:

{key1: 1, key2: 2}.length # => 2

答案 3 :(得分:3)

由于第一个count()返回一个哈希,所以使用你想要的任何Ruby可枚举操作。例如:

User.where("zip_code = '48104'").group('users.id').count.count

另见:

答案 4 :(得分:3)

如前所述 orourkedd ,在处理大量记录时,接受的答案并不好。我最近也遇到过这个问题,并且有一些我绝对不想加载到内存中的大表。所以这对我有用。

users=User.where("zip_code = '48104'").group('users.id')
user_count=User.where(id: users.select(:id)).count

Rails将像子查询一样处理users.select部分。这适用于 Rails 4

答案 5 :(得分:0)

另一种方法,如果值可以是>则非常有用。 1。

User.where("zip_code = '48104'").group('users.id').count.values.sum