Programing

레일 : 열에서 고유 한 값을 선택하십시오.

lottogame 2020. 4. 22. 08:08
반응형

레일 : 열에서 고유 한 값을 선택하십시오.


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

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

반응형