Ответ 1
Еще два способа:
Products.select(:category).map(&:category).uniq
Products.uniq.pluck(:category)
Для Rails> = 5.1 используйте:
Products.distinct.pluck(:category)
Как получить уникальные значения из столбца в таблице? Например, у меня есть эта таблица продуктов:
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%>
Еще два способа:
Products.select(:category).map(&:category).uniq
Products.uniq.pluck(:category)
Для Rails> = 5.1 используйте:
Products.distinct.pluck(:category)
Я думаю, вы можете это сделать:
<% Products.select("DISTINCT(CATEGORY)").each do |p| %>
<%= p.category %>
<% end %>
Источник: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
Это делает всю работу на сервере базы данных. В результате получается простой массив.
<% Product.distinct(:category).pluck(:category).each do |category|
<%= category %>
<% end %>
Rails будет генерировать SQL, который работает в любой базе данных (Postgres, MySQL и т.д.).
SELECT DISTINCT "products"."category" FROM "products"
Я предлагаю использовать Products.all.distinct.pluck(:category)
, потому что uniq
устарел с рельсов 5 и будет удален на рельсах 5.1
Попробуйте это (в консоли rails)
Product.group(:category)
Product.group(:category).each { |p| p.name }
Для 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
)
Требуется получить уникальный результат и безуспешно пытается использовать метод uniq. Пробовал несколько решений, отправленных здесь неудачно. Я использую devise, который дает мне доступ к методу current_user
и работает с двумя таблицами, один из которых является соединением (элемент has_many: things).
Это решение в конечном итоге сработало для меня:
@current_user.things.select(:item_fk).distinct.each do |thing|
<%= thing.item.attribute %>
<% end %>