ti-enxame.com

Rails: como posso obter valores exclusivos da coluna

Como posso obter valores exclusivos da coluna na tabela? Por exemplo, eu tenho essa tabela Produtos:

ID NAME CATEGORY
1 name1 1st_cat
2 name2 2nd_cat
3 name3 1st_cat

Aqui eu quero obter apenas 2 valores - 1st_cat e 2nd_cat:

<%Products.each do |p|%>
<%=p.category%>
<%end%>
59
Oleg Pasko

Mais duas maneiras:

Products.select(:category).map(&:category).uniq

Products.uniq.pluck(:category)
130
user664833

Eu acho que você pode fazer isso:

<% Products.select("DISTINCT(CATEGORY)").each do |p| %>
<%= p.category %>
<% end %>

Fonte: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields

25
ThatOtherPerson

Isso faz todo o trabalho no servidor de banco de dados. O resultado é um array simples.

<% Product.distinct(:category).pluck(:category).each do |category|
    <%= category %>
<% end %>

Rails irá gerar SQL que funciona em qualquer banco de dados (Postgres, MySQL, etc).

SELECT DISTINCT "products"."category" FROM "products"
9
jelder

Tente isso (no console do Rails)

Product.group(:category)

Product.group(:category).each { |p| p.name }
6
maprihoda

Eu sugiro usar Products.all.distinct.pluck(:category) porque uniq foi preterido desde o Rails 5 e será removido no Rails 5.1

5
Fabio Ros

Para postgres

<% Product.select("DISTINCT ON (category) *").each do |category|
    <%= category %>
    <%= name %>
<% end %>
0
srghma

Necessário para obter saída única e estava tentando o método 'uniq' sem sucesso. Tentei várias soluções postadas aqui sem sucesso. Estou usando o programa que me dá acesso ao método current_user e trabalhando com duas tabelas, sendo uma delas uma junção (um item has_many: things).

Esta solução acabou por funcionar para mim:

@current_user.things.select(:item_fk).distinct.each do |thing|
 <%= thing.item.attribute %>
<% end %>
0
Phil_ish