Rails: 列から一意の値を選択する 質問する

Rails: 列から一意の値を選択する 質問する

すでに機能する解決策がありますが、なぜこれが機能しないのかを本当に知りたいです。

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

選択はしますが、一意の値は出力せず、重複値を含むすべての値を出力します。ドキュメントに記載されています: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields

ベストアンサー1

Model.select(:rating)

この結果はModelオブジェクトのコレクションです。単純な評価ではありません。uniqの観点から見ると、それらは完全に異なります。次のように使用できます。

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

またはこれ(最も効率的):

Model.uniq.pluck(:rating)

レール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']

おすすめ記事