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

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).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']

在我的场景中,我希望根据创建日期对不同的名称进行排序,并应用offset和limit。基本上是ORDER BY和DISTINCT ON的组合

你所需要做的就是在拔拔方法中设置DISTINCT ON,就像下面这样

模型。order("name, created_at DESC").offset(0).limit(10)。pluck("DISTINCT ON (name) name")

这将返回一个不同名称的数组。

Model.uniq.pluck(:rating)

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

这具有不使用sql字符串和不实例化模型的优点

Model.select(:rating).uniq

从rails 3.2开始,这段代码就像“DISTINCT”一样工作(而不是Array#uniq)

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

如果您的Model有数千条记录,其他答案就不能很好地工作

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

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

因为,首先生成一个Model数组(由于选择而减小了大小),然后提取那些所选模型的唯一属性(评级)