Rails: how can I get unique values from column

Ruby on-RailsRuby on-Rails-3Unique

Ruby on-Rails Problem Overview


How can I get unique values from column in the table? For example, I have this Products table:

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

Here I want to get only 2 values - 1st_cat and 2nd_cat:

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

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

Two more ways:

Product.select(:category).map(&:category).uniq # Ruby does the work

Product.uniq.pluck(:category) # DB does the work (superior)

For Rails >= 5.1 use:

Product.distinct.pluck(:category) # DB does the work (superior)

...because Relation#uniq was deprecated.

Solution 2 - Ruby on-Rails

I think you can do this:

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

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

Solution 3 - Ruby on-Rails

This does all the work in the database server. The result is a simple array.

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

Rails will generate SQL that works on any database (Postgres, MySQL, etc).

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

Solution 4 - Ruby on-Rails

I suggest to use Products.all.distinct.pluck(:category) because uniq has been deprecated since rails 5 and it will be removed on rails 5.1

Solution 5 - Ruby on-Rails

Try this (in the rails console)

Product.group(:category)

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

Solution 6 - Ruby on-Rails

For postgres

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

Update

even better

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

because it can return wrong columns when you do joins (e.g. returns id column from joined table, but not products)

Solution 7 - Ruby on-Rails

Needed to get unique output and was trying the 'uniq' method unsuccessfully. Tried several solutions posted here unsuccessfully. I'm using devise which gives me access to the current_user method and working with two tables, one being a join (an item has_many :things).

This solution ultimately worked for me :

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

Solution 8 - Ruby on-Rails

If you or anyone want to get two or more attributes from a table like products, based on a distinct feature of an attribute, only this solution will help you for Rails >= 5.1

distinct_products = Product.select("DISTINCT ON (category) *")

# it's an active record relation class.
> distinct_products.class
=> Product::ActiveRecord_Relation

N.B. Don't use .pluck() on the distinct_products. It will reselect from the products table and the distinct feature will not work anymore.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionOleg PaskoView Question on Stackoverflow
Solution 1 - Ruby on-Railsuser664833View Answer on Stackoverflow
Solution 2 - Ruby on-RailsThatOtherPersonView Answer on Stackoverflow
Solution 3 - Ruby on-RailsjelderView Answer on Stackoverflow
Solution 4 - Ruby on-RailsFabio RosView Answer on Stackoverflow
Solution 5 - Ruby on-RailsMarek PříhodaView Answer on Stackoverflow
Solution 6 - Ruby on-RailssrghmaView Answer on Stackoverflow
Solution 7 - Ruby on-RailsPhil_ishView Answer on Stackoverflow
Solution 8 - Ruby on-RailsTamal ChakrobortyView Answer on Stackoverflow