Rails:从列中选择唯一值

时间:2012-03-11 21:04:28

标签: ruby-on-rails activerecord

我已经有了一个可行的解决方案,但我真的想知道为什么这不起作用:

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

它选择但不打印唯一值,它会打印所有值,包括重复值。它在文档中:http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields

12 个答案:

答案 0 :(得分:411)

Model.select(:rating)

这是Model个对象的集合。不是简单的评级。从uniq的角度来看,它们完全不同。你可以用这个:

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

或此(最有效)

Model.uniq.pluck(:rating)

# rails 5+
Model.distinct.pluck(:rating)

更新

显然,从rails 5.0.0.1开始,它仅适用于“顶级”查询,如上所述。不适用于集合代理(例如“has_many”关系)。

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

在这种情况下,在查询后进行重复数据删除

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

答案 1 :(得分:85)

如果您要使用Model.select,那么您也可以使用DISTINCT,因为它只返回唯一值。这样做更好,因为它意味着它返回更少的行,并且应该比返回多个行稍快,然后告诉Rails选择唯一值。

Model.select('DISTINCT rating')

当然,只要您的数据库了解DISTINCT关键字,大多数都应该这样做。

答案 2 :(得分:58)

这也有效。

Model.pluck("DISTINCT rating")

答案 3 :(得分:26)

Model.uniq.pluck(:rating)

# SELECT DISTINCT "models"."rating" FROM "models"

这样做的好处是不使用sql字符串而不是实例化模型

答案 4 :(得分:21)

Model.select(:rating).uniq

此代码作为'DISTINCT'(而非Array #uniq)起作用rails 3.2

答案 5 :(得分:4)

答案 6 :(得分:3)

如果有人在寻找与Mongoid相同的东西,那就是

Model.distinct(:rating)

答案 7 :(得分:3)

有些答案没有考虑到OP需要数组值

如果您的模型有数千条记录

,其他答案将无效

那就是说,我认为一个好的答案是:

    Model.uniq.select(:ratings).map(&:ratings)
    => "SELECT DISTINCT ratings FROM `models` " 

因为,首先生成一个Model数组(由于select而缩小了大小),然后提取所选模型所具有的唯一属性(等级)

答案 8 :(得分:1)

Model.select(:rating).distinct

答案 9 :(得分:1)

使用sql收集uniq列的另一种方法:

Model.group(:rating).pluck(:rating)

答案 10 :(得分:0)

您可以使用以下宝石:active_record_distinct_on

Model.distinct_on(:rating)

产生以下查询:

SELECT DISTINCT ON ( "models"."rating" ) "models".* FROM "models"

答案 11 :(得分:-1)

Model.pluck("DISTINCT column_name")