Search code examples
ruby-on-railsactiverecord

Rails: select unique values from a column


I already have a working solution, but I would really like to know why this doesn't work:

ratings = Model.select(:rating).uniq
ratings.each { |r| puts r.rating }

It selects, but don't print unique values, it prints all values, including the duplicates. And it's in the documentation: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields


Solution

  • Model.select(:rating)
    

    The result of this is a collection of Model objects. Not plain ratings. And from uniq's point of view, they are completely different. You can use this:

    Model.select(:rating).map(&:rating).uniq
    

    or this (most efficient):

    Model.uniq.pluck(:rating)
    

    Rails 5+

    Model.distinct.pluck(:rating)
    

    Update

    Apparently, as of rails 5.0.0.1, it works only on "top level" queries, like above. Doesn't work on collection proxies ("has_many" relations, for example).

    Address.distinct.pluck(:city) # => ['Moscow']
    user.addresses.distinct.pluck(:city) # => ['Moscow', 'Moscow', 'Moscow']
    

    In this case, deduplicate after the query

    user.addresses.pluck(:city).uniq # => ['Moscow']