복붙노트

[RUBY-ON-RAILS] 루비에서 객체 속성에 의해 UNIQ

RUBY-ON-RAILS

루비에서 객체 속성에 의해 UNIQ

하나 개 이상의 속성에 대한 고유 한 배열에서 객체를 선택하는 가장 우아한 방법은 무엇입니까?

AR의 방법을 사용하는 것은 너무 잘 될 것이다, 그래서 이러한 객체는 액티브에 저장됩니다.

해결법

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

    1.블록으로 사용 배열 번호의 UNIQ :

    블록으로 사용 배열 번호의 UNIQ :

    @photos = @photos.uniq { |p| p.album_id }
    
  2. ==============================

    2.프로젝트의 배열에 uniq_by 방법을 추가합니다. 그것은 sort_by와 유사한 방식으로 작동합니다. sort_by 정렬하는 것입니다 그래서 uniq_by UNIQ이다. 용법:

    프로젝트의 배열에 uniq_by 방법을 추가합니다. 그것은 sort_by와 유사한 방식으로 작동합니다. sort_by 정렬하는 것입니다 그래서 uniq_by UNIQ이다. 용법:

    uniq_array = my_array.uniq_by {|obj| obj.id}
    

    구현 :

    class Array
      def uniq_by(&blk)
        transforms = []
        self.select do |el|
          should_keep = !transforms.include?(t=blk[el])
          transforms << t
          should_keep
        end
      end
    end
    

    제자리에있는 당신의 현재를 수정하지 않고 새 배열을 반환합니다. 우리는 uniq_by을 작성하지 않았습니다! 당신이 원한다면 방법이지만 쉽게 충분합니다.

    EDIT : Tribalvibes는 (N은 2 ^)이 구현 O임을 지적한다. 더 나은이 (테스트되지 않은) 같은 것 ...

    class Array
      def uniq_by(&blk)
        transforms = {}
        select do |el|
          t = blk[el]
          should_keep = !transforms[t]
          transforms[t] = true
          should_keep
        end
      end
    end
    
  3. ==============================

    3.데이터베이스 수준에서 그것을 수행

    데이터베이스 수준에서 그것을 수행

    YourModel.find(:all, :group => "status")
    
  4. ==============================

    4.당신은 배열에서 여러 속성 요소에 의해 고유 한 선택이 트릭을 사용할 수 있습니다 :

    당신은 배열에서 여러 속성 요소에 의해 고유 한 선택이 트릭을 사용할 수 있습니다 :

    @photos = @photos.uniq { |p| [p.album_id, p.author_id] }
    
  5. ==============================

    5.나는 원래 배열에 대한 선택 방법을 사용하여 제안했다. 재치하려면 :

    나는 원래 배열에 대한 선택 방법을 사용하여 제안했다. 재치하려면 :

    [1, 2, 3, 4, 5, 6, 7] {ALL 기타 사항 서보 -OFF | E | E % 2 == 0} 우리에게 [2,4,6] 등을 제공합니다.

    당신은 최초의 객체를 원한다면, 감지 사용합니다.

    [1, 2, 3, 4, 5, 6, 7] .detect {| E | 전자> 3} 우리에게 4를 제공합니다.

    나는 확실히 당신은하지만, 여기에 대한려고하고 있지 않다 무엇을.

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

    6.해시의 jmah의 사용과 같은 나는 고유성 적용합니다. 여기에 피부가 고양이에 몇 가지 더 많은 방법을이다 :

    해시의 jmah의 사용과 같은 나는 고유성 적용합니다. 여기에 피부가 고양이에 몇 가지 더 많은 방법을이다 :

    objs.inject({}) {|h,e| h[e.attr]=e; h}.values
    

    그건 좋은 일 라이너,하지만 난이 조금 더 빨리 생각되는 :

    h = {}
    objs.each {|e| h[e.attr]=e}
    h.values
    
  7. ==============================

    7.내가 제대로 질문을 이해한다면, 나는 마샬링 어떤 속성이 변화 여부를 결정하기 위해 개체를 비교하는 준 해키 접근법을 사용하여이 문제를 태클했습니다. 다음 코드의 끝 부분에 분사는 예를 들어 다음과 같습니다

    내가 제대로 질문을 이해한다면, 나는 마샬링 어떤 속성이 변화 여부를 결정하기 위해 개체를 비교하는 준 해키 접근법을 사용하여이 문제를 태클했습니다. 다음 코드의 끝 부분에 분사는 예를 들어 다음과 같습니다

    class Foo
      attr_accessor :foo, :bar, :baz
    
      def initialize(foo,bar,baz)
        @foo = foo
        @bar = bar
        @baz = baz
      end
    end
    
    objs = [Foo.new(1,2,3),Foo.new(1,2,3),Foo.new(2,3,4)]
    
    # find objects that are uniq with respect to attributes
    objs.inject([]) do |uniqs,obj|
      if uniqs.all? { |e| Marshal.dump(e) != Marshal.dump(obj) }
        uniqs << obj
      end
      uniqs
    end
    
  8. ==============================

    8.내가 찾은 가장 우아한 방법은 블록 스핀 오프 사용하여 배열 번호의 UNIQ입니다

    내가 찾은 가장 우아한 방법은 블록 스핀 오프 사용하여 배열 번호의 UNIQ입니다

    enumerable_collection.uniq(&:property)
    

    ... 더 나은 너무 읽고!

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

    9.각 키에 대한 하나의 값을 포함하는 해시를 사용할 수 있습니다 :

    각 키에 대한 하나의 값을 포함하는 해시를 사용할 수 있습니다 :

    Hash[*recs.map{|ar| [ar[attr],ar]}.flatten].values
    
  10. ==============================

    10.또한 레일 #uniq_by 방법 못한 - 매개 변수화 어레이 # 1 UNIQ 참조 (즉, uniq_by)

    또한 레일 #uniq_by 방법 못한 - 매개 변수화 어레이 # 1 UNIQ 참조 (즉, uniq_by)

  11. ==============================

    11.나는 jmah와 헤드의 답변을 좋아합니다. 그러나 그들은 배열 순서를 유지합니까? 그들은 루비의 이후 버전에서 언어 사양에 기록 일부 해시 삽입 순서 보존 요구 사항이되었을 수도 있기 때문에,하지만 여기에 내가 그 보존에 관계없이 주문 사용하고자하는 유사한 솔루션입니다.

    나는 jmah와 헤드의 답변을 좋아합니다. 그러나 그들은 배열 순서를 유지합니까? 그들은 루비의 이후 버전에서 언어 사양에 기록 일부 해시 삽입 순서 보존 요구 사항이되었을 수도 있기 때문에,하지만 여기에 내가 그 보존에 관계없이 주문 사용하고자하는 유사한 솔루션입니다.

    h = Set.new
    objs.select{|el| h.add?(el.attr)}
    
  12. ==============================

    12.ActiveSupport 구현 :

    ActiveSupport 구현 :

    def uniq_by
      hash, array = {}, []
      each { |i| hash[yield(i)] ||= (array << i) }
      array
    end
    
  13. ==============================

    13.블록으로 사용 배열 번호의 UNIQ :

    블록으로 사용 배열 번호의 UNIQ :

    objects.uniq {|obj| obj.attribute}
    

    아니면 더 간결 방법 :

    objects.uniq(&:attribute)
    
  14. ==============================

    14.지금 당신은이 작업을 수행 할 수있는 속성 값에 정렬 할 수 있습니다 경우 :

    지금 당신은이 작업을 수행 할 수있는 속성 값에 정렬 할 수 있습니다 경우 :

    class A
      attr_accessor :val
      def initialize(v); self.val = v; end
    end
    
    objs = [1,2,6,3,7,7,8,2,8].map{|i| A.new(i)}
    
    objs.sort_by{|a| a.val}.inject([]) do |uniqs, a|
      uniqs << a if uniqs.empty? || a.val != uniqs.last.val
      uniqs
    end
    

    1 속성에 대한 고유하지만 같은 일이 W / 사전 식 정렬 할 수 있습니다 그 ...

  15. from https://stackoverflow.com/questions/109781/uniq-by-object-attribute-in-ruby by cc-by-sa and MIT license