我已经有了一个有效的解决方案,但我真的很想知道为什么这行不通:
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
当前回答
如果你要使用模型。select,那么你可能只使用DISTINCT,因为它只会返回唯一的值。这样更好,因为这意味着它返回更少的行,并且应该比返回一些行然后告诉Rails选择惟一值略快。
Model.select('DISTINCT rating')
当然,前提是您的数据库能够理解DISTINCT关键字,而且大多数数据库都应该理解。
其他回答
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']
您可以使用以下Gem: active_record_distinct_on
Model.distinct_on(:rating)
产生以下查询:
SELECT DISTINCT ON ( "models"."rating" ) "models".* FROM "models"
如果你要使用模型。select,那么你可能只使用DISTINCT,因为它只会返回唯一的值。这样更好,因为这意味着它返回更少的行,并且应该比返回一些行然后告诉Rails选择惟一值略快。
Model.select('DISTINCT rating')
当然,前提是您的数据库能够理解DISTINCT关键字,而且大多数数据库都应该理解。
有些答案没有考虑到OP需要一个值数组
如果您的Model有数千条记录,其他答案就不能很好地工作
也就是说,我认为一个很好的答案是:
Model.uniq.select(:ratings).map(&:ratings)
=> "SELECT DISTINCT ratings FROM `models` "
因为,首先生成一个Model数组(由于选择而减小了大小),然后提取那些所选模型的唯一属性(评级)
这也有用。
Model.pluck("DISTINCT rating")