我已经有了一个有效的解决方案,但我真的很想知道为什么这行不通:

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

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


当前回答

如果我要直接走,那么:

当前查询

Model.select(:rating)

返回数组对象和你写的查询

Model.select(:rating).uniq

Uniq应用于对象数组,每个对象都有唯一的id。Uniq正在正确地执行它的工作,因为数组中的每个对象都是Uniq。

有许多方法来选择不同的评级:

Model.select('distinct rating').map(&:rating)

or

Model.select('distinct rating').collect(&:rating)

or

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

or

Model.select(:name).collect(&:rating).uniq

还有一件事,第一个和第二个查询:通过SQL查询找到不同的数据。

这些查询将被认为是“london”和“london”,这意味着它将忽略空格,这就是为什么它将在您的查询结果中选择“london”一次。

第三和第四个查询:

通过SQL查询查找数据,对于不同的数据应用ruby uniq方法。 这些查询将被认为“london”和“london”不同,这就是为什么它将在您的查询结果中同时选择“london”和“london”。

请喜欢附上的图片,以获得更多的理解,并查看“已参观/等待RFP”。

其他回答

您可以使用以下Gem: active_record_distinct_on

Model.distinct_on(:rating)

产生以下查询:

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

这也有用。

Model.pluck("DISTINCT rating")

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

Model.group(:rating).pluck(:rating)
Model.select(:rating).distinct
Model.pluck("DISTINCT column_name")