如何找到与数组1中的false元素对应的数组2的元素?

时间:2013-10-29 21:30:29

标签: ruby-on-rails ruby

我正在通过has_many关系更新模型,我正在试图找出哪些元素没有正确更新,以便我可以抛出一个合理的例外:

foos_updated = foos.collect do |foo|
  foo.update_attributes({:attribute => update})
end

如果foos_updated.count(true) == foos.count,我知道所有更新都已完成。但是,如果某些foos没有更新,我会在false数组中包含food_updated个元素。

foos_updated中的虚假元素映射到foos中的相应元素的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

我会使用稍微不同的方法:

 rejected = foos.reject{ |foo| foo.update_attributes(attribute: update) }

 if rejected.any?
   # do something
 end

或者可能是一种不太复杂,更明确的方式:

errors = []
foos.each do |foo|
  foo.update_attribute(attribute: update)
  errors << foo if foo.errors.any? 
end   

事实上,对于AR对象你也可以这样做:

foos.each{ |foo| foo.update_attributes(attribute: update) }
rejected = foos.select{ |foo| foo.errors.any? }

取决于上下文,如果失败的可能性很小,而您只是想抛出明智的异常,那就这样做:

foos.each do |foo|
  begin
    foo.update_attribute!(attribute: update) # notice the bang!
  rescue ActiveRecord::RecordInvalid => e
    # do something (store message, etc.) and / or re-raise
  end
end