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

我可以使用以下内容:

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

得到如下的哈希:

 {195=>1, 106=>1, 120=>1, 227=>1, 247=>1, 264=>1, 410=>1} 

有没有办法可以计算这些哈希值,只返回7 ,而不是上面的结果?

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

尝试:

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

接受的答案是不可扩展的。 在具有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,顺便说一句。

它的灵感来自于这个人: https : //github.com/mrbrdo/active_record_group_count/blob/master/lib/active_record_group_count/scope.rb

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

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

如果您只想要键数,那么:

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

由于第一个count()返回一个哈希值,因此请使用您希望的任何Ruby可枚举操作。 例:

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

也可以看看:

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

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

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

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

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