Ich habe bereits eine funktionierende Lösung, würde aber gerne wissen, warum dies nicht funktioniert:
ratings = Model.select(:rating).uniq
ratings.each { |r| puts r.rating }
Es werden eindeutige Werte ausgewählt, aber nicht gedruckt. Es werden alle Werte einschließlich der Duplikate gedruckt. Und es ist in der Dokumentation: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
ruby-on-rails
activerecord
alexandrecosta
quelle
quelle
Antworten:
Das Ergebnis ist eine Sammlung von
Model
Objekten. Keine einfachen Bewertungen. Und ausuniq
Sicht sind sie völlig anders. Sie können dies verwenden:oder dies (am effizientesten)
Aktualisieren
Ab Rails 5.0.0.1 funktioniert es anscheinend nur bei Abfragen der obersten Ebene, wie oben. Funktioniert nicht mit Sammlungsproxys (z. B. "has_many" -Relationen).
In diesem Fall nach der Abfrage deduplizieren
quelle
Model.uniq.pluck(:rating)
der effizienteste Weg ist - dies generiert SQL, das verwendetSELECT DISTINCT
und nicht.uniq
auf ein ArrayModel.uniq.pluck(:rating)
wirdModel.distinct.pluck(:rating)
Model.related_records.group(:some_column).pluck(:some_column)
Wenn Sie verwenden möchten
Model.select
, können Sie auch einfach verwendenDISTINCT
, da nur die eindeutigen Werte zurückgegeben werden. Dies ist besser, da dies bedeutet, dass weniger Zeilen zurückgegeben werden und etwas schneller sein sollte als die Rückgabe mehrerer Zeilen und die Anweisung von Rails, die eindeutigen Werte auszuwählen.Dies setzt natürlich
DISTINCT
voraus, dass Ihre Datenbank das Schlüsselwort versteht und die meisten sollten.quelle
Model.select("DISTINCT rating").map(&:rating)
um eine Reihe nur der Bewertungen zu erhalten.Das funktioniert auch.
quelle
pluck
ist eine reine Rails> 3.2-Methode, die keine Abhängigkeit von Ruby 1.9.x hat. Siehe apidock.com/rails/v3.2.1/ActiveRecord/Calculations/pluckWenn Sie auch zusätzliche Felder auswählen möchten:
quelle
select extra fields
<3 <3Dies hat den Vorteil, dass keine SQL-Zeichenfolgen verwendet und keine Modelle instanziiert werden
quelle
Dieser Code funktioniert als 'DISTINCT' (nicht als Array # uniq), da Rails 3.2
quelle
quelle
.pluck(:rating)
am Ende wird jedoch genau das erreicht, was das OP verlangt hat.Wenn ich auf dem richtigen Weg bin, dann:
Aktuelle Abfrage
gibt ein Array von Objekten zurück und Sie haben eine Abfrage geschrieben
uniq wird auf ein Array von Objekten angewendet und jedes Objekt hat eine eindeutige ID. uniq führt seine Aufgabe korrekt aus, da jedes Objekt im Array uniq ist.
Es gibt viele Möglichkeiten, eine bestimmte Bewertung auszuwählen:
oder
oder
oder
Eine weitere Sache, erste und zweite Abfrage: Finden Sie unterschiedliche Daten durch SQL-Abfrage.
Diese Abfragen werden als "London" und "London" betrachtet. Dies bedeutet, dass der Platz vernachlässigt wird. Aus diesem Grund wird in Ihrem Abfrageergebnis einmal "London" ausgewählt.
Dritte und vierte Abfrage:
Finden Sie Daten durch SQL-Abfrage und für bestimmte Daten angewendet Ruby Uniq Mehtod. Diese Abfragen werden als "London" und "London" unterschiedlich betrachtet. Aus diesem Grund werden in Ihrem Abfrageergebnis "London" und "London" ausgewählt.
Bitte ziehen Sie zum besseren Verständnis das angehängte Bild vor und sehen Sie sich "Toured / Awaiting RFP" an.
quelle
map
&collect
Sind Aliase für dieselbe Methode, müssen keine Beispiele für beide angegeben werden.Einige Antworten berücksichtigen nicht, dass das OP eine Reihe von Werten wünscht
Andere Antworten funktionieren nicht gut, wenn Ihr Modell Tausende von Datensätzen enthält
Trotzdem denke ich, dass eine gute Antwort lautet:
Da Sie zuerst ein Array von Modellen generieren (mit einer aufgrund der Auswahl verringerten Größe), extrahieren Sie dann das einzige Attribut, das diese ausgewählten Modelle haben (Bewertungen).
quelle
Wenn jemand mit Mongoid dasselbe sucht, dann ist das so
quelle
Eine andere Möglichkeit, Uniq-Spalten mit SQL zu sammeln:
quelle