Myx*_*tic 14 activerecord ruby-on-rails
我可以使用以下内容:
User.where("zip_code = '48104'").group('users.id').count
Run Code Online (Sandbox Code Playgroud)
得到如下的哈希:
{195=>1, 106=>1, 120=>1, 227=>1, 247=>1, 264=>1, 410=>1}
Run Code Online (Sandbox Code Playgroud)
有没有办法计算这些哈希值,只返回7,而不是上面的结果?
我知道在上面的场景中这没有意义,我可以通过不使用group子句来实现.但是我正在研究一个更复杂的查询,我需要实现它.提前致谢.
rob*_*rit 20
尝试:
User.where("zip_code = '48104'").group('users.id').count.length
Run Code Online (Sandbox Code Playgroud)
oro*_*edd 10
接受的答案是不可扩展的.在具有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
Run Code Online (Sandbox Code Playgroud)
它是这样使用的:
query = User.where("zip_code = '48104'").group('users.id')
count = count_query(query)
Run Code Online (Sandbox Code Playgroud)
这适用于我使用mysql,顺便说一句.
它的灵感来自于这个人:https://github.com/mrbrdo/active_record_group_count/blob/master/lib/active_record_group_count/scope.rb
正如orourkedd之前所说,在处理大量记录时,接受的答案并不是很好。我最近也遇到了这个问题,并且有一些我绝对不想加载到内存中的大表。所以这对我有用。
users=User.where("zip_code = '48104'").group('users.id')
user_count=User.where(id: users.select(:id)).count
Run Code Online (Sandbox Code Playgroud)
Rails 将像子查询一样处理 users.select 部分。这适用于Rails 4
归档时间: |
|
查看次数: |
10398 次 |
最近记录: |