Rails: как я могу получить уникальные значения из столбца

Как получить уникальные значения из столбца в таблице? Например, у меня есть эта таблица продуктов:

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

Здесь я хочу получить только 2 значения - 1st_cat и 2nd_cat:

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

Ответ 1

Еще два способа:

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

Products.uniq.pluck(:category)

Для Rails> = 5.1 используйте:

Products.distinct.pluck(:category)

Ответ 3

Это делает всю работу на сервере базы данных. В результате получается простой массив.

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

Rails будет генерировать SQL, который работает в любой базе данных (Postgres, MySQL и т.д.).

SELECT DISTINCT "products"."category" FROM "products"

Ответ 4

Я предлагаю использовать Products.all.distinct.pluck(:category), потому что uniq устарел с рельсов 5 и будет удален на рельсах 5.1

Ответ 5

Попробуйте это (в консоли rails)

Product.group(:category)

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

Ответ 6

Для postgres

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

Обновить

даже лучше

<% Product.select(%(DISTINCT ON (category) "#{Product.table_name}".*)).each do |category|
    <%= category %>
    <%= name %>
<% end %>

потому что он может возвращать неправильные столбцы, когда вы делаете joins (например, возвращает столбец id из объединенной таблицы, но не products)

Ответ 7

Требуется получить уникальный результат и безуспешно пытается использовать метод uniq. Пробовал несколько решений, отправленных здесь неудачно. Я использую devise, который дает мне доступ к методу current_user и работает с двумя таблицами, один из которых является соединением (элемент has_many: things).

Это решение в конечном итоге сработало для меня:

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