Ruby从数组数组构建数组的有效方法

时间:2010-04-24 02:26:56

标签: ruby-on-rails ruby

我有一个ActiveRecord对象数组,每个对象都有自己的错误数组。我想将它全部展平,只将唯一值放入一个数组中。所以顶级数组可能如下所示:

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

arr = [foo0, foo1, foo2, foo3]

这些对象中的每一个都可能有一个错误数组,我想从它们中获取唯一的消息并将它们放在另一个数组中,比如称为error_arr。你会怎么做“Ruby”的方式?

3 个答案:

答案 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