Ruby-on-Rails: Selecting distinct values from the model

The docs:

Clearly state that:

query = Client.select(:name).distinct
# => Returns unique names

However, when I try that in my controller, I get the following error:

undefined method `distinct' for #<ActiveRecord::Relation:0xb2f6f2cc>

To be clear, I want the distinct names, like ['George', 'Brandon'], not the clients actual records. Is there something that I am missing?

4

4 Answers

Rails 2

If you are still on rails 2 you will need to use:

Client.select('distinct(name)')

Rails 3

If you are on Rails 3 you will need to use:

Client.select(:name).uniq

If you look at the equivalent section of the rails 3 guide you can see the difference between the two versions.

Rails 4+

The .distinct option was added for rails 4 which is what the latest guides refer to.

Client.select(:name).distinct
3

If you do not want ActiveRecord::Relations returned, just an array of the names as strings, then use:

Client.distinct.pluck(:name)

To get an ordered result set:

Client.order(:name).distinct.pluck(:name)
0

There are some approaches:

  1. Rails way:

    Model.select(:name).distinct
  2. Semi-rails way

    Model.select("DISTINCT ON(models.name) models.*")

    The second allows you to select the first record uniqued by name, but in the whole matter, not only names.

This will work for Rails 2 (pretty old rails I know!), 3 and 4.

Client.select('distinct(name)')

This will actually use the SQL select distinct statement

SELECT distinct name FROM clients

2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like