17

我可以使用以下内容:

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子句来做到这一点。但是我正在处理一个更复杂的查询,我需要在其中实现它。提前致谢。

4

6 回答 6

24

尝试:

User.where("zip_code = '48104'").group('users.id').count.length
于 2012-09-05T14:37:43.250 回答
13

接受的答案不可扩展。对具有 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

于 2014-01-09T21:41:45.243 回答
4

如果要将哈希值相加,则:

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

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

{key1: 1, key2: 2}.length # => 2
于 2012-09-05T14:41:31.893 回答
4

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

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

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

于 2016-11-28T20:40:33.107 回答
3

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

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

也可以看看:

于 2012-09-05T14:44:32.970 回答
0

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

User.where("zip_code = '48104'").group('users.id').count.values.sum
于 2014-12-11T13:56:20.420 回答