1. ホーム
  2. ruby-on-rails

[解決済み] Rails: カラムからユニークな値を選択する

2022-02-19 06:59:45

質問内容

すでに動作するソリューションを持っているのですが、なぜこれが動作しないのか、どうしても知りたいのです。

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)

この結果は 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']