Rails 4通过单个属性查询唯一

所以这不仅仅是一个问题,而是我想要做的事情。

我有三个对象,叫做Items

   

我想做一个只返回每个唯一“name”属性中的一个的查询。

类似于Item.select('distinct(name), items.*')

这不起作用,它仍然返回所有三个项目。

如何形成此查询以便它只返回:

   

如果您想要恢复整个模型,但仍然保持唯一性,可以使用:

 Item.select('distinct on (name) *') 

我只用Postgres数据库对它进行了测试。 它可能适用于或不适用于mysql。

请试试这个:

 Item.select('distinct name') 

如果您只需要一个带有名称但没有ID的数组,您可以执行以下操作:

 Item.pluck(:name).uniq 

SQL查询结果:

 #=> SELECT `items`.`name` FROM `items` 

**编辑**

uniq在记录数组上运行。 如果你期望有很多记录,要小心。 SQL Distinct要快得多。

如果是这样,请使用上面的vee答案,并附上map

Item.select('distinct name').map(:name)

在Rails 4中,尝试Items.all.to_a.uniq { |item| item.name } Items.all.to_a.uniq { |item| item.name }

在Rails 3中,您应该只能执行Items.uniq_by { |item| item.name } Items.uniq_by { |item| item.name }

当你在一个数组上调用uniq时,你可以传递一个块来指示如何确定唯一性。 在Rails 3中你曾经能够使用uniq_by ,但它在Rails 4中被弃用了。所以我找到的一种方法是将ActiveRecord Relation转换为数组并在其上调用uniq

对于Mysql,您可以使用已禁用ONLY_FULL_GROUP_BY的 group

 Item.group(:name).to_sql => "SELECT `items`.* FROM `items` GROUP BY name" 

请参阅mysql 5.6是否有ANY_VALUEfunction?

以下是Rails ORM查询,它将使用所有最新的rails版本rails 5.X生成所需的结果。

 @unique_values= [] Model.all.group_by(&:column_name).each do |key, val| if val.count == 1 @unique_values << val else @unique_values << val.first end end