2012-02-06 11 views
1

이전에 질문을 올렸습니다. Issues with DISTINCT when used in conjunction with ORDER에 내 컴퓨터에서 로컬로 작업 한 훌륭한 답변을 받았습니다. 그러나 코드를 서버에 푸시하면 결과에 아무런 영향을주지 않습니다 ... 이후 호스트 공급자에게 연락하여 서버의 Ruby 버전이 1.8.7임을 확인했습니다.Array # Uniq in Ruby1.8.7

마음, 사람이 어떻게 우리의 서버에서 실행하는 방법으로

@unique_results = @filtered_names.uniq { |result| result.athlete_id }

에 해당 할 수있는 방법을 말해 줄 수?

약자 @unique_results@filtered_names과 동일하며 반복 이름 (원래 게시물에 설명 된대로)은 출력에 남아 있습니다. 시간

답변

2

당신이 Array#uniq_by을 사용할 수 있습니다 3.* 레일을 사용하는 경우에 대한

감사합니다.

그렇지 않으면 당신은 (그것은 매우 간단합니다 그것을보고 페이지에 Show source 클릭) 구현에 보면 자신과 떨어지게 유사한 작업을 수행하거나 Array 클래스를 다시 열고 그 uniq_by 방법을 추가 할 수 있습니다.

2

과 그 외 다른 많은 블록이 포함 된 의 backports을 보석 목록에 추가 할 수 있습니다. 또한 한 조각 만 원할 경우 체리에서 업데이트 된 uniq을 선택할 수 있습니다.

+0

* 1 멋진 라이브러리입니다. – lucapette

2

마스터 링을 향한 한 걸음 Ruby는 "핵심"작업으로 이해하기에 충분히 일반적인 일부 기능이 필요할 때 핵심 클래스를 확장하는 법을 배웁니다. 프로그래밍 배경이 덜 동적 인 언어라면, 익숙해 져야합니다.

require 'set' 
module Enumerable 
    def uniq(&b) 
    if block_given? 
     self.map(&b).to_set.to_a 
    else 
     self.to_set.to_a 
    end 
    end 
end 

그것은 루비 1.9에 내장 된 uniq만큼 효율적되지 않습니다,하지만 여전히 O (N)이다 :이 경우에 나는 이런 식으로 뭔가를 추가합니다.

이 항목을 Enumerable에 추가하면 Arrays가 아닌 다른 항목에도 사용할 수 있습니다. 어떤 enumerable 클래스가보다 효율적인 버전을 정의하면,이 메소드는 그것을 오버라이드하지 않습니다. Ruby 메소드 검색 알고리즘은 포함 된 모듈에 정의 된 메소드를 찾기 전에 먼저 클래스에 직접 정의 된 메소드를 검사합니다.

Ruby 1.8을 많이 사용하는 경우이 파일을 나만의 개인 핵심 확장 파일에 추가하여 향후 프로젝트에 사용할 수 있습니다. 관심이 있으시면 https://github.com/alexdowad/showcase/blob/master/ruby-core/collections.rb에 내 개인 핵심 확장 기능 (Ruby 1.9)이 있습니다.