Wie kann ich die Anzahl der Datensätze zählen, die in einem bestimmten Feld in ROR einen eindeutigen Wert haben?

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

Frage

Ich habe einen Datensatz, der ein Datumsfeld enthält, und möchte ermitteln, wie viele eindeutige Datumsangaben im Datensatz dargestellt werden.

Etwas wie:

Record.find(:all).date.unique.count 

aber das scheint natürlich nicht zu funktionieren.

War es hilfreich?

Lösung

Was Sie suchen, ist das folgende SQL:

SELECT COUNT(DISTINCT date) FROM records

ActiveRecord hat Folgendes eingebaut:

Record.count('date', :distinct => true)

Andere Tipps

Dies hat sich in den Schienen 4 und höher leicht geändert :distinct => true ist jetzt veraltet.Verwenden:

Record.distinct.count('date')

Oder wenn Sie das Datum und die Nummer wünschen:

Record.group(:date).distinct.count(:date)

Außerhalb von SQL:

Record.find(:all).group_by(&:date).count

ActiveSupports Aufzählbar#group_by ist unverzichtbar.

das Neueste #count On-Rails-Quellcode akzeptiert nur 1 Parameter.sehen: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count

also habe ich die Anforderung erfüllt durch

Record.count('DISTINCT date')

Die Antwort im Einzelnen:

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}

Wie ich bereits erwähnt habe Hier, in Rails 4, mit (...).uniq.count(:user_id) Wie in anderen Antworten erwähnt (für diese Frage und anderswo auf SO), wird dies tatsächlich zu einem Extra führen DISTINCT in der Abfrage sein:

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

Was wir eigentlich tun müssen, ist, selbst einen SQL-String zu verwenden:

(...).count("DISTINCT user_id")

Was uns gibt:

SELECT COUNT(DISTINCT user_id) FROM ...

Stellen Sie außerdem sicher, dass Sie über einen Index für das Feld in Ihrer Datenbank verfügen, da die Abfrage sonst schnell langsam wird.

(Es ist viel besser, dies in SQL zu tun, andernfalls ziehen Sie die gesamte Datenbanktabelle in den Speicher, nur um die Zählung zu beantworten.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top