복붙노트

[RUBY-ON-RAILS] 열에서 선택 고유 한 값 : 레일

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

해결법

  1. ==============================

    1.

    Model.select(:rating)
    

    이것의 결과는 모델 객체의 모음입니다. 일반하지 평가. 그리고보기의 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']
    
  2. ==============================

    2.당신이 Model.select을 사용하려고하는 경우에만 고유 한 값을 반환하므로, 당신은뿐만 아니라 그냥 DISTINCT 사용할 수 있습니다. 그것은 적은 행을 반환하고 고유 한 값을 선택하는 레일을 말하는 다음 행의 수를 반환하고보다 좀 더 빠르게 처리 될 수 의미하기 때문에이 좋습니다.

    당신이 Model.select을 사용하려고하는 경우에만 고유 한 값을 반환하므로, 당신은뿐만 아니라 그냥 DISTINCT 사용할 수 있습니다. 그것은 적은 행을 반환하고 고유 한 값을 선택하는 레일을 말하는 다음 행의 수를 반환하고보다 좀 더 빠르게 처리 될 수 의미하기 때문에이 좋습니다.

    Model.select('DISTINCT rating')
    

    물론,이 데이터베이스가 DISTINCT 키워드를 이해 제공되며, 대부분은해야한다.

  3. ==============================

    3.이 역시 작동합니다.

    이 역시 작동합니다.

    Model.pluck("DISTINCT rating")
    
  4. ==============================

    4.당신은 또한 추가 필드를 선택합니다 :

    당신은 또한 추가 필드를 선택합니다 :

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

    5.

    Model.uniq.pluck(:rating)
    
    # SELECT DISTINCT "models"."rating" FROM "models"
    

    이것은 SQL 문자열을 사용하지 않는 장점과 인스턴스화되지 모델을 가지고

  6. ==============================

    6.

    Model.select(:rating).uniq
    

    이 코드는 레일 3.2 이후 (안 배열 번호의 UNIQ 등) 'DISTINCT'로 작동

  7. ==============================

    7.나는 방법에 권리를 다음려고하는 경우 :

    나는 방법에 권리를 다음려고하는 경우 :

    현재 쿼리

    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
    

    한 가지 더, 제 1 및 제 2 쿼리 : SQL 쿼리에 의해 구별 데이터를 찾을 수 있습니다.

    이 쿼리는 '런던'쿼리 결과에서 한 시간을 선택합니다 그 이유는 "런던"하고 공간을 무시한다 "런던"같은 수단으로 간주됩니다.

    셋째 갔다 쿼리 :

    SQL 쿼리에 의해 별개의 데이터에 대한 데이터가 루비 UNIQ mehtod을 적용 찾을 수 있습니다. 이 쿼리는 쿼리 결과에서 모두 '런던'과 '런던'을 선택합니다 그 이유는, "런던"다른 "런던"으로 간주됩니다.

    더 이해 첨부 된 이미지를 선호한다 "여행 / 대기 RFP"에 봐주십시오.

  8. ==============================

    8.일부 답변은 영업 이익이 값의 배열을 원하는 고려하지 않는다

    일부 답변은 영업 이익이 값의 배열을 원하는 고려하지 않는다

    다른 답변은 귀하의 모델은 수천 개의 레코드가있는 경우 잘 작동하지 않는다

    그게 내가 좋은 답변이라고 생각했다 :

        Model.uniq.select(:ratings).map(&:ratings)
        => "SELECT DISTINCT ratings FROM `models` " 
    

    먼저 당신이 (때문에 선택의 감소 크기) 모델의 배열을 생성하기 때문에, 당신이 (가) 만 선택 모델이 가진 속성 추출 (평가)

  9. ==============================

    9.

    Model.select(:rating).distinct
    
  10. ==============================

    10.사람이 Mongoid와 같은 찾고있는 경우, 즉

    사람이 Mongoid와 같은 찾고있는 경우, 즉

    Model.distinct(:rating)
    
  11. ==============================

    11.또 다른 방법은 SQL 독특한 열을 수집합니다 :

    또 다른 방법은 SQL 독특한 열을 수집합니다 :

    Model.group(:rating).pluck(:rating)
    
  12. from https://stackoverflow.com/questions/9658881/rails-select-unique-values-from-a-column by cc-by-sa and MIT license