Wie kann ich die Anzahl der Datensätze zählen, die in einem bestimmten Feld in ROR einen eindeutigen Wert haben?
-
09-06-2019 - |
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.
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.)