Като цяло обработката на изключения трябва да е в най-близката точка до грешката, в която можете да направите нещо разумно с изключението. Във вашия случай бихте искали вашето rescue във вашия цикъл, например:
stuff.each do |h|
begin
Model.create(h)
rescue ActiveRecord::RecordNotUnique => e
next if(e.message =~ /unique.*constraint.*INDEX_NAME_GOES_HERE/)
raise
end
end
Няколко интересни точки:
- Нарушение на ограничение в базата данни ще ви даде
ActiveRecord::RecordNotUniqueгрешка, а не основнатаPG::Error. AFAIK, ще получитеPG::Errorако разговаряте директно с базата данни, вместо да минавате през ActiveRecord. - Заменете
INDEX_NAME_GOES_HEREс истинското име на уникалния индекс. - Искате да игнорирате само конкретното нарушение на ограничението, което очаквате, следователно
next if(...)бит, последван отraiseбез аргументи (т.е. повдигнете повторно изключението, ако не е това, което очаквате да видите).