0

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

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

如果foos_updated.count(true) == foos.count,我知道所有更新都通过了。但是,如果某些 foo 没有更新,我将在数组中包含false元素。food_updated

将错误元素映射foos_updated到相应元素的最佳方法是foos什么?

4

1 回答 1

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 
于 2013-10-29T21:45:13.723 回答