2015-01-09 4 views
0

문자열을 키로하고 AR 개체를 값으로 사용하여 .group_by 메서드로 만든 해시가 있습니다. 그리고 복제 된 필드가있는 AR 객체 을 제거하고 싶습니다 (다른 필드는 동일하거나 다를 수 있음).그룹화 된 해시의 고유 개체

나는이 조각 만든 질문 명확히하기 위해 여기

require 'ostruct' 

def os_new(fid); OpenStruct.new(fid: fid, rand: rand(100)); end                                    
a = [os_new(1), os_new(2), os_new(3)]                                     
b = [os_new(3), os_new(3), os_new(2)]                                     
c = [os_new(5), os_new(5), os_new(5), os_new(5)] 

grouped_hash = { a: a, b: b, c: c} 

grouped_hash 것은 :

# {:a=>[#<OpenStruct fid=1, rand=7>, #<OpenStruct fid=2, rand=50>, #<OpenStruct fid=3, rand=13>], 
# :b=>[#<OpenStruct fid=3, rand=51>, #<OpenStruct fid=3, rand=58>, #<OpenStruct fid=2, rand=88>], 
# :c=>[#<OpenStruct fid=5, rand=40>, #<OpenStruct fid=5, rand=8>, #<OpenStruct fid=5, rand=45>, #<OpenStruct fid=5, rand=72>]} 

이제 결과에서 나는 각각의 키에 대해 고유 한 fid s의 해시를 원하는 :

# {:a=>[#<OpenStruct fid=1, rand=7>, #<OpenStruct fid=2, rand=50>, #<OpenStruct fid=3, rand=13>], 
# :b=>[#<OpenStruct fid=3, rand=51>, #<OpenStruct fid=2, rand=88>], 
# :c=>[#<OpenStruct fid=5, rand=40>]} 

내 솔루션에는 여러 가지 동작이 필요하며보기가 복잡합니다.

grouped_hash.each_value do |value|                                      
    fids = [] 
    value.delete_if do |object| 
    if fids.include? object.fid                                        
     true 
    else                                             
     fids << object.fid 
     false 
    end                                             
    end 
end 

가장 우아한 (가능한 한 1 라이너) 효율적인 방법 (해시 다시 만들기 없음)을 찾고 있습니다.

답변

2

grouped_hash.each_value(&:uniq)

AR은 개체에 따르면, 식별 컬럼에 의도적 위임 어떤지 검사 레일. 두 개의 AR 객체가 동일한 값을 가지고 있다는 것을 알고 싶다면 두 개의 #attributes를 호출 한 결과를 비교하십시오.

1

아니 정확히 한 줄 (너무 한 줄에 쓸 수 있지만) :

grouped_hash.inject({}) do |hash, element| 
    hash[element.first] = element.last.uniq(&:fid) 
    hash 
end 
+0

I을 'id'가 혼란스러워하지 않고 각 객체에 다른 필드가 있다는 것을 증명하기 위해 질문을 업데이트했습니다. 그래서'uniq'는 작동하지 않을 것입니다. –

+0

'uniq (& : fid)'는 어떻습니까? (업데이트 된 답변) – katafrakt

+0

감사합니다! 나는 아이디어를 얻었다! 당신의 해법은 해시를 재현하기 때문에 @Tensho와 결합하여 답을하고 싶습니다. –

0

Tenshokatafrakt을 결합하여 나는이 만든 응답 (너희들 감사) :

grouped_hash.each_value { |v| v.uniq!(&:fid) }