Come posso contare il numero di record che hanno un valore univoco in un particolare campo in ROR?
-
09-06-2019 - |
Domanda
Ho un set di record che include un campo data e desidero determinare quante date univoche sono rappresentate nel set di record.
Qualcosa di simile a:
Record.find(:all).date.unique.count
ma ovviamente non sembra funzionare.
Soluzione
Quello che stai cercando è il seguente SQL:
SELECT COUNT(DISTINCT date) FROM records
ActiveRecord ha questo integrato:
Record.count('date', :distinct => true)
Altri suggerimenti
Questo è leggermente cambiato nei binari 4 e successivi :distinct => true
è ora deprecato.Utilizzo:
Record.distinct.count('date')
Oppure se vuoi la data e il numero:
Record.group(:date).distinct.count(:date)
Al di fuori di SQL:
Record.find(:all).group_by(&:date).count
ActiveSupport Enumerabile#group_by è indispensabile.
l'ultimo #count
il codice sorgente on rails accetta solo 1 parametro.Vedere: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count
quindi ho raggiunto il requisito entro
Record.count('DISTINCT date')
Dettagliando la risposta:
Post.create(:user_id => 1, :created_on => '2010-09-29')
Post.create(:user_id => 1, :created_on => '2010-09-29')
Post.create(:user_id => 2, :created_on => '2010-09-29')
Post.create(:user_id => null, :created_on => '2010-09-29')
Post.group(:created_on).count
# => {'2010-09-29' => 4}
Post.group(:created_on).count(:user_id)
# => {'2010-09-29' => 3}
Post.group(:created_on).count(:user_id, :distinct => true) # Rails <= 3
Post.group(:created_on).distinct.count(:user_id) # Rails = 4
# => {'2010-09-29' => 2}
Come ho già detto Qui, in Rails 4, utilizzando (...).uniq.count(:user_id)
come menzionato in altre risposte (per questa domanda e altrove su SO) porterà effettivamente a un extra DISTINCT
essere nella query:
SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...
Ciò che in realtà dobbiamo fare è utilizzare noi stessi una stringa SQL:
(...).count("DISTINCT user_id")
Il che ci dà:
SELECT COUNT(DISTINCT user_id) FROM ...
Inoltre, assicurati di avere un indice sul campo nel tuo db, altrimenti la query diventerà rapidamente lenta.
(È molto meglio farlo in SQL, altrimenti inserisci in memoria l'intera tabella db solo per rispondere al conteggio.)