我会使用稍微不同的方法:
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