我已经有了一个有效的解决方案,但我真的很想知道为什么这行不通:
ratings = Model.select(:rating).uniq
ratings.each { |r| puts r.rating }
它选择,但不打印唯一值,而是打印所有值,包括重复的值。它在文档中:http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
我已经有了一个有效的解决方案,但我真的很想知道为什么这行不通:
ratings = Model.select(:rating).uniq
ratings.each { |r| puts r.rating }
它选择,但不打印唯一值,而是打印所有值,包括重复的值。它在文档中:http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
当前回答
在我的场景中,我希望根据创建日期对不同的名称进行排序,并应用offset和limit。基本上是ORDER BY和DISTINCT ON的组合
你所需要做的就是在拔拔方法中设置DISTINCT ON,就像下面这样
模型。order("name, created_at DESC").offset(0).limit(10)。pluck("DISTINCT ON (name) name")
这将返回一个不同名称的数组。
其他回答
如果我要直接走,那么:
当前查询
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”。
Model.select(:rating).distinct
用sql收集uniq列的另一种方法:
Model.group(:rating).pluck(:rating)
Model.uniq.pluck(:rating)
# SELECT DISTINCT "models"."rating" FROM "models"
这具有不使用sql字符串和不实例化模型的优点
如果你要使用模型。select,那么你可能只使用DISTINCT,因为它只会返回唯一的值。这样更好,因为这意味着它返回更少的行,并且应该比返回一些行然后告诉Rails选择惟一值略快。
Model.select('DISTINCT rating')
当然,前提是您的数据库能够理解DISTINCT关键字,而且大多数数据库都应该理解。