Wie kann ich eindeutige Werte aus der Spalte in der Tabelle abrufen? Zum Beispiel habe ich diese Produkttabelle:
ID NAME CATEGORY
1 name1 1st_cat
2 name2 2nd_cat
3 name3 1st_cat
Hier möchte ich nur 2 Werte erhalten - 1st_cat und 2nd_cat:
<%Products.each do |p|%>
<%=p.category%>
<%end%>
ruby-on-rails
ruby-on-rails-3
unique
Oleg Pasko
quelle
quelle
Antworten:
Zwei weitere Möglichkeiten:
Product.select(:category).map(&:category).uniq # Ruby does the work Product.uniq.pluck(:category) # DB does the work (superior)
Für Schienen> = 5.1 verwenden Sie:
Product.distinct.pluck(:category) # DB does the work (superior)
... da
Relation#uniq
war veraltet .quelle
User.uniq.pluck(:source)
produziert,SELECT DISTINCT "users"."source" FROM "users"
also glaube ich nicht, dass es alle Datensätze in ein Ruby-Array lädt.Products.distinct.pluck(:category)
Ich denke, Sie können dies tun:
<% Products.select("DISTINCT(CATEGORY)").each do |p| %> <%= p.category %> <% end %>
Quelle: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
quelle
Dies erledigt die gesamte Arbeit auf dem Datenbankserver. Das Ergebnis ist ein einfaches Array.
<% Product.distinct(:category).pluck(:category).each do |category| <%= category %> <% end %>
Rails generiert SQL, das in jeder Datenbank (Postgres, MySQL usw.) funktioniert.
SELECT DISTINCT "products"."category" FROM "products"
quelle
Ich schlage vor, zu verwenden,
Products.all.distinct.pluck(:category)
weiluniq
seit Schienen 5 veraltet ist und es auf Schienen 5.1 entfernt wirdquelle
Versuchen Sie dies (in der Rails-Konsole)
Product.group(:category) Product.group(:category).each { |p| p.name }
quelle
Für Postgres
<% Product.select("DISTINCT ON (category) *").each do |category| <%= category %> <%= name %> <% end %>
Aktualisieren
noch besser
<% Product.select(%(DISTINCT ON (category) "#{Product.table_name}".*)).each do |category| <%= category %> <%= name %> <% end %>
weil es dabei falsche Spalten zurückgeben kann
joins
(z. B.id
Spalte aus verknüpfter Tabelle zurückgeben, aber nichtproducts
)quelle
Musste eine eindeutige Ausgabe erhalten und versuchte die 'uniq'-Methode erfolglos. Versuchte mehrere hier veröffentlichte Lösungen erfolglos. Ich verwende devise, mit dem ich auf die
current_user
Methode zugreifen und mit zwei Tabellen arbeiten kann, von denen eine ein Join ist (ein Element has_many: things).Diese Lösung hat letztendlich bei mir funktioniert:
@current_user.things.select(:item_fk).distinct.each do |thing| <%= thing.item.attribute %> <% end %>
quelle