Като цяло обработката на изключения трябва да е в най-близката точка до грешката, в която можете да направите нещо разумно с изключението. Във вашия случай бихте искали вашето 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
без аргументи (т.е. повдигнете повторно изключението, ако не е това, което очаквате да видите).