2010-04-24 6 views
0

각 배열에는 자체 오류 배열이있는 ActiveRecord 개체의 배열이 있습니다. 나는 그것을 모두 밖으로 평평하게하고 유일한 값을 하나의 배열로 얻고 싶습니다. 같은 최상위 배열이 보일 수 있습니다 : 해당 객체의 각각 잠재적 오류의 배열을 가질 수있다, 그리고 나는 그들 중 단지 고유의 메시지가 다른 배열에 넣어 싶습니다배열 배열에서 배열을 빌드하는 루비 효율적인 방법

foo0 = Foo.new 
foo1 = Foo.new 
foo2 = Foo.new 
foo3 = Foo.new 

arr = [foo0, foo1, foo2, foo3] 

, 말하자면 error_arr이라고합니다. "루비"방식으로 어떻게 할 수 있을까요?

답변

4

코드 :이 당신이 원하는 희망

arr = [foo0, foo1, foo2, foo3] 
arr.map{|record| record.errors.full_messages }.flatten.uniq 

. 메소드 호출은 사용자의 설명과 매우 일치합니다 ("flatten", "uniq").

1
require 'set' 
error_arr = [foo0, foo1, foo2, foo3].reduce(Set.new) do |set, arr| 
    set.merge(arr.errors) 
end.to_a 

EDIT :이 대답은 각 foo에 오류 배열이있는 경우에 적용됩니다. 실제 배열과 비슷한 문제가있는 경우를 대비하여 대답을 남깁니다. 다음 당신은 단순히 배열에 오류 메시지를 얻고 싶다면

다음을 수행하십시오 :

+0

ActiveRecord.errors는 실제 배열이 아닙니다. 병합 함수는 집합과 병합되면 예외를 throw합니다. –

0

이 시도

def merge_errors(arr) 
    [].tap do |errors| 
    arr.each{|m| errors += m.errors.full_messages} 
    end 
end 

는 액티브 :: 오류 클래스에있는 오류 메시지를 얻고 싶은 경우에, 다음과 같이

지금
def merge_errors(arr) 
    ActiveRecord::Errors.new({}).tap do |all_error| 
    arr.each{|model| model.errors.each_full{|m| all_error.add_to_base(m)} 
    end 
end 

당신은 기능을 사용할 수 있습니다 : 다음 다음을 수행

arr = [foo0, foo1, foo2, foo3] 
errors = merge_errors(arr) 
unless errors.empty? 
    # handle error 
end 
관련 문제