我已经有一个可行的解决方案,但是我真的很想知道为什么这不起作用:
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
Answers:
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']
Model.uniq.pluck(:rating)
是最有效的方法-生成的SQL使用SELECT DISTINCT
而不是应用.uniq
到数组
Model.uniq.pluck(:rating)
将是Model.distinct.pluck(:rating)
Model.related_records.group(:some_column).pluck(:some_column)
如果要使用Model.select
,则最好使用DISTINCT
,因为它将仅返回唯一值。这样会更好,因为这意味着它返回的行较少,并且比返回若干行然后告诉Rails选择唯一值的速度要快一些。
Model.select('DISTINCT rating')
当然,前提是您的数据库可以理解该DISTINCT
关键字,并且大多数情况下应该如此。
Model.select("DISTINCT rating").map(&:rating)
以获得一系列的评分。
这也可以。
Model.pluck("DISTINCT rating")
pluck
是不依赖Ruby 1.9.x的纯Rails> 3.2方法。请参阅apidock.com/rails/v3.2.1/ActiveRecord/Calculations/pluck
如果还要选择其他字段:
Model.select('DISTINCT ON (models.ratings) models.ratings, models.id').map { |m| [m.id, m.ratings] }
select extra fields
<3 <3
Model.uniq.pluck(:rating)
# SELECT DISTINCT "models"."rating" FROM "models"
这具有不使用sql字符串和不实例化模型的优点
如果我要走的路:
当前查询
Model.select(:rating)
返回对象数组,您已编写查询
Model.select(:rating).uniq
uniq应用于对象数组,并且每个对象都有唯一的ID。uniq正确执行其工作,因为数组中的每个对象都是uniq。
有很多方法可以选择不同的等级:
Model.select('distinct rating').map(&:rating)
要么
Model.select('distinct rating').collect(&:rating)
要么
Model.select(:rating).map(&:rating).uniq
要么
Model.select(:name).collect(&:rating).uniq
另外,第一和第二查询:通过SQL查询查找不同的数据。
这些查询将被视为“ london”和“ london”,这意味着它将忽略空格,这就是为什么它将在查询结果中一次选择“ london”的原因。
第三和第四查询:
通过SQL查询查找数据,并针对不同的数据应用ruby uniq mehtod。这些查询将认为“ london”和“ london”不同,这就是为什么它将在查询结果中同时选择“ london”和“ london”的原因。
请更喜欢附上图片以了解更多信息,并查看“巡回/等待RFP”。
map
&collect
是同一方法的别名,无需为两者提供示例。
使用sql收集uniq列的另一种方法:
Model.group(:rating).pluck(:rating)