2010-04-24 213 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 

編輯:如果每個foo有一個錯誤數組,這顯然不是這種情況,這個答案有效。如果有人遇到類似真實數組的問題,我會留下答案。

+0

ActiveRecord.errors不是一個真正的數組。如果合併函數與一個集合合併,它將引發異常。 – 2010-04-24 03:02:38

0

試試這個:

如果你想簡單地在陣列中的錯誤消息,然後執行以下操作:

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

如果你想獲得的ActiveRecord ::錯誤類的錯誤信息,然後執行以下操作:

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