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

受け入れられた答えはスケーラブルではありません。@robbrit のメソッドを 25,000 人の一致するユーザーを持つクエリで使用すると、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

前に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 に答える
4

ハッシュの値を一緒に追加する場合は、次のようにします。

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

キーの数だけが必要な場合は、次のようにします。

{key1: 1, key2: 2}.length # => 2
于 2012-09-05T14:41:31.893 に答える
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 に答える