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