So this is more of an arel question than anything but here\'s what I am trying to do.
I have three objects lets say, called Items
-
If you only need an array with the names, without the ID, you can do:
Item.pluck(:name).uniq
SQL query result:
#=> SELECT `items`.`name` FROM `items`
** edit **
The uniq
is ran on the array of records. Be careful if you expect a lot of records.
SQL Distinct is much faster.
If so, use vee's answer above, with a map
:
Item.select('distinct name').map(:name)
I can't comment on posts yet, so, putting this as another answer for the question.
In case of someone still searches for this, @BananaNeil's answer is correct. However, putting distinct
in select
didn't work for me (Rails 5.2.2). Separating these two did fix my problem.
klass.where(
# Your query or whatever
).distinct.select('on (attribute) *')
If you want to get the entire model back, but still maintain uniqueness, you can use this:
Item.select('distinct on (name) *')
I've only tested this with a Postgres database. It may or may not work with mysql.
For Mysql, your can use group
with ONLY_FULL_GROUP_BY disabled,
Item.group(:name).to_sql
=> "SELECT `items`.* FROM `items` GROUP BY name"
See Is there ANY_VALUE capability for mysql 5.6?
Please try this:
Item.select('distinct name')
In Rails 4 try Items.all.to_a.uniq { |item| item.name }
In Rails 3 you should be able to just do Items.uniq_by { |item| item.name }
When you call uniq
on an array, you can pass it a block to dictate how to determine uniqueness. In Rails 3 you used to be able to use uniq_by
, but it became deprecated in Rails 4. So one method I found is to just convert the ActiveRecord Relation to an array and call uniq
on that.