레일 : 열에서 고유 한 값을 선택하십시오.
이미 작동하는 솔루션이 있지만 왜 이것이 작동하지 않는지 알고 싶습니다.
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.uniq.pluck(:rating)
# SELECT DISTINCT "models"."rating" FROM "models"
이것은 SQL 문자열을 사용하지 않고 모델을 인스턴스화하지 않는 이점이 있습니다
추가 필드를 선택하려면 다음을 수행하십시오.
Model.select('DISTINCT ON (models.ratings) models.ratings, models.id').map { |m| [m.id, m.ratings] }
Model.select(:rating).uniq
이 코드는 레일 3.2 이후 'DISTINCT'(Array # uniq가 아님)로 작동합니다.
내가 옳은 길을 가고 있다면 :
현재 검색어
Model.select(:rating)
객체 배열을 반환하고 쿼리를 작성했습니다.
Model.select(:rating).uniq
uniq는 객체 배열에 적용되며 각 객체에는 고유 한 ID가 있습니다. 배열의 각 객체가 uniq이므로 uniq이 작업을 올바르게 수행하고 있습니다.
별개의 등급을 선택하는 방법은 여러 가지가 있습니다.
Model.select('distinct rating').map(&:rating)
또는
Model.select('distinct rating').collect(&:rating)
또는
Model.select(:rating).map(&:rating).uniq
또는
Model.select(:name).collect(&:rating).uniq
하나 더, 첫 번째와 두 번째 쿼리 : SQL 쿼리로 고유 한 데이터를 찾습니다.
이러한 쿼리는 "london"과 "london"으로 간주되며 공간을 무시한다는 의미이므로 쿼리 결과에서 'london'을 한 번 선택합니다.
세 번째 및 네 번째 쿼리 :
SQL 쿼리로 데이터를 찾고 고유 한 데이터를 적용하려면 ruby uniq mehtod를 적용하십시오. 이러한 쿼리는 "london"과 "london"이 다른 것으로 간주되므로 쿼리 결과에서 'london'과 'london'을 모두 선택합니다.
자세한 내용은 첨부 된 이미지를 참조하고 "Toured / Awaiting RFP"를 참조하십시오.
일부 답변은 OP가 값 의 배열을 원한다는 점을 고려하지 않습니다.
모델에 수천 개의 레코드가있는 경우 다른 답변이 제대로 작동하지 않습니다
즉, 좋은 대답은 다음과 같습니다.
Model.uniq.select(:ratings).map(&:ratings)
=> "SELECT DISTINCT ratings FROM `models` "
먼저, 선택으로 인해 크기가 줄어든 모델 배열을 생성 한 다음 선택한 모델에있는 유일한 속성 (등급)을 추출하기 때문에
Mongoid와 같은 것을 찾는 사람이라면
Model.distinct(:rating)
Model.select(:rating).distinct
SQL로 유니크 열을 수집하는 또 다른 방법 :
Model.group(:rating).pluck(:rating)
참고 URL : https://stackoverflow.com/questions/9658881/rails-select-unique-values-from-a-column
'Programing' 카테고리의 다른 글
Visual Studio Server Explorer에서 LocalDB에 연결하는 방법은 무엇입니까? (0) | 2020.04.22 |
---|---|
코드에서 layout_weight 속성을 동적으로 설정하는 방법은 무엇입니까? (0) | 2020.04.22 |
모든 예외를 잡는 C ++ (0) | 2020.04.22 |
Razor View Engine, 프리 프로세서 입력 방법 (#if 디버그) (0) | 2020.04.22 |
문자열에서 마지막 문자를 제거하십시오. (0) | 2020.04.22 |