我有一个ActiveRecord对象数组,每个对象都有自己的错误数组。我想将它全部展平,只将唯一值放入一个数组中。所以顶级数组可能如下所示:
foo0 = Foo.new
foo1 = Foo.new
foo2 = Foo.new
foo3 = Foo.new
arr = [foo0, foo1, foo2, foo3]
这些对象中的每一个都可能有一个错误数组,我想从它们中获取唯一的消息并将它们放在另一个数组中,比如称为error_arr
。你会怎么做“Ruby”的方式?
答案 0 :(得分:4)
代码:
arr = [foo0, foo1, foo2, foo3]
arr.map{|record| record.errors.full_messages }.flatten.uniq
我希望这就是你想要的。方法调用非常接近地匹配您的描述(“flatten”,“uniq”)。
答案 1 :(得分:1)
require 'set'
error_arr = [foo0, foo1, foo2, foo3].reduce(Set.new) do |set, arr|
set.merge(arr.errors)
end.to_a
编辑:如果每个foo都有一个错误数组,这个答案是有效的,显然并非如此。我会留下答案,以防有人与真实数组有类似的问题。
答案 2 :(得分:0)
试试这个:
如果您只想在数组中获取错误消息,请执行以下操作:
def merge_errors(arr)
[].tap do |errors|
arr.each{|m| errors += m.errors.full_messages}
end
end
如果要在ActiveRecord :: Errors类中获取错误消息,请执行以下操作:
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