我正在通过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
中的相应元素的最佳方法是什么?
答案 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