[ruby-on-rails] 레일 : 열에서 고유 한 값을 선택하십시오.

이미 작동하는 솔루션이 있지만 왜 이것이 작동하지 않는지 알고 싶습니다.

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)

최신 정보

레일즈 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.select하므로을 사용할 수도 있습니다 DISTINCT. 이것은 적은 수의 행을 반환하고 많은 수의 행을 반환 한 다음 Rails에게 고유 한 값을 선택하도록 지시하는 것보다 약간 더 빠르다는 것을 의미하기 때문에 더 좋습니다.

Model.select('DISTINCT rating')

물론 이것은 데이터베이스가 DISTINCT키워드를 이해하고 제공 해야하는 경우에 제공됩니다.


답변

이것도 작동합니다.

Model.pluck("DISTINCT rating")


답변

추가 필드를 선택하려면 다음을 수행하십시오.

Model.select('DISTINCT ON (models.ratings) models.ratings, models.id').map { |m| [m.id, m.ratings] }


답변

Model.uniq.pluck(:rating)

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

이것은 SQL 문자열을 사용하지 않고 모델을 인스턴스화하지 않는 이점이 있습니다


답변

Model.select(:rating).uniq

이 코드는 레일 3.2 이후 ‘DISTINCT'(Array # uniq가 아님)로 작동합니다.


답변

Model.select(:rating).distinct