[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.
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.당신이 Model.select을 사용하려고하는 경우에만 고유 한 값을 반환하므로, 당신은뿐만 아니라 그냥 DISTINCT 사용할 수 있습니다. 그것은 적은 행을 반환하고 고유 한 값을 선택하는 레일을 말하는 다음 행의 수를 반환하고보다 좀 더 빠르게 처리 될 수 의미하기 때문에이 좋습니다.
당신이 Model.select을 사용하려고하는 경우에만 고유 한 값을 반환하므로, 당신은뿐만 아니라 그냥 DISTINCT 사용할 수 있습니다. 그것은 적은 행을 반환하고 고유 한 값을 선택하는 레일을 말하는 다음 행의 수를 반환하고보다 좀 더 빠르게 처리 될 수 의미하기 때문에이 좋습니다.
Model.select('DISTINCT rating')
물론,이 데이터베이스가 DISTINCT 키워드를 이해 제공되며, 대부분은해야한다.
-
==============================
3.이 역시 작동합니다.
이 역시 작동합니다.
Model.pluck("DISTINCT rating")
-
==============================
4.당신은 또한 추가 필드를 선택합니다 :
당신은 또한 추가 필드를 선택합니다 :
Model.select('DISTINCT ON (models.ratings) models.ratings, models.id').map { |m| [m.id, m.ratings] }
-
==============================
5.
Model.uniq.pluck(:rating) # SELECT DISTINCT "models"."rating" FROM "models"
이것은 SQL 문자열을 사용하지 않는 장점과 인스턴스화되지 모델을 가지고
-
==============================
6.
Model.select(:rating).uniq
이 코드는 레일 3.2 이후 (안 배열 번호의 UNIQ 등) 'DISTINCT'로 작동
-
==============================
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.일부 답변은 영업 이익이 값의 배열을 원하는 고려하지 않는다
일부 답변은 영업 이익이 값의 배열을 원하는 고려하지 않는다
다른 답변은 귀하의 모델은 수천 개의 레코드가있는 경우 잘 작동하지 않는다
그게 내가 좋은 답변이라고 생각했다 :
Model.uniq.select(:ratings).map(&:ratings) => "SELECT DISTINCT ratings FROM `models` "
먼저 당신이 (때문에 선택의 감소 크기) 모델의 배열을 생성하기 때문에, 당신이 (가) 만 선택 모델이 가진 속성 추출 (평가)
-
==============================
9.
Model.select(:rating).distinct
-
==============================
10.사람이 Mongoid와 같은 찾고있는 경우, 즉
사람이 Mongoid와 같은 찾고있는 경우, 즉
Model.distinct(:rating)
-
==============================
11.또 다른 방법은 SQL 독특한 열을 수집합니다 :
또 다른 방법은 SQL 독특한 열을 수집합니다 :
Model.group(:rating).pluck(:rating)
from https://stackoverflow.com/questions/9658881/rails-select-unique-values-from-a-column by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일 / lib에 모듈과 (0) | 2020.02.10 |
---|---|
[RUBY-ON-RAILS] 나는 그것을 제거에 무엇을 ". 응답 본문의 내용 길이를 결정할 수 없습니다 WARN"평균 얼마나됩니까? (0) | 2020.02.10 |
[RUBY-ON-RAILS] 어떻게 레일에 모델 속성이 발견합니까? (0) | 2020.02.10 |
[RUBY-ON-RAILS] 조건 NIL을 NOT 사용하는 경우 레일 (0) | 2020.02.10 |
[RUBY-ON-RAILS] 유증 여러 "사용자"모델 (0) | 2020.02.10 |