Come posso contare il numero di record che hanno un valore univoco in un particolare campo in ROR?

StackOverflow https://stackoverflow.com/questions/36608

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.

È stato utile?

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.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top