2012-07-12 2 views
1

50KB가 넘는 레코드를 반환하는 쿼리 결과가 있습니다. 내가 할 :레일스의 배열에서 고유 한 활성 레코드 객체를 수집 하시겠습니까?

@array.collect {|x| x.field_name1}.uniq, @array.collect {|x| x.field_name2}.uniq 

..보기에서 여러 선택에 대한 필터를 만듭니다. 꽤 오래 걸립니다. 성능을 향상시키기 위해 하나의 루프에서 모든 고유 요소를 수집 할 수있는 방법이 있습니까? 감사

+0

그것은 좋은 질문이 – Trip

답변

4

뭔가

unique_field_1_values = Set.new 
unique_field_2_values = Set.new 
@array.each do |x| 
    unique_field_1_values << x 
    unique_field_2_values << x 
end 

한 번만 배열을 반복하고 당신에게 필드의 고유 한 값으로 두 세트를 제공합니다있다. 그것이 더 빠르다는 것을 확실히 알지 못한다. 고유의 열 값을 선택 (하드 코딩 된 SQL 제외)

+6

.. 생각의 내가 더 빨리 독특한 요소를 얻을 것이라고 생각 직접 SQL 쿼리,하지 루비. – tokland

+0

아마도, 아마도 당신이 각 속성마다 하나의 쿼리를 필요로한다고 생각하지만 인덱스에 따라 특히 그렇습니다. –

+0

빠른 응답을 주셔서 감사합니다. 나는 세트에 대해 전혀 생각하지 않았다. 그게 내 필요에 맞는거야. 나중에 결과를 사용해야 할 때 SQL 쿼리를 사용할 수 없습니다. DB를 한 번만 쿼리 한 다음 결과를 처리하는 것이 더 효과적이라고 생각했습니다. – Dennis

10

순수 루비/레일 방법은 다음과 같습니다이다 @Frederick 노트로

[:field1, :field2].map { |f| YourTable.select(f).uniq } 

: @의 tokland의 주석의 라인을 따라

uniq_fields1 = Model.uniq.pluck(:field_1) 
# issues: SELECT DISTINCT field_1 FROM "models" 
0

실제로 db에 2 개의 히트를 기록하지만, 더 빠를 가능성이 크며, 해당 필드에 인덱스가 있다면 거의 빠를 것입니다. 내가 질문을 오해하지 않은 경우

+0

값이 아닌 관계를 얻을 수 있습니다 (작성자의 코드로 판단 할 때 필요합니다). – jdoe

+0

실제로. 교차 게시는 나를 다시 얻습니다. 날 뽑아 줬어. 넌 날 뽑아 줬어. –

0

, uniq뿐만 아니라 당신에게 고유 한 개체를 제공해야합니다 :

array_of_objects.uniq 

Documentation