Ogólnie rzecz biorąc, obsługa wyjątków powinna znajdować się najbliżej błędu, aby można było zrobić coś sensownego z wyjątkiem. W twoim przypadku chciałbyś, aby Twój rescue wewnątrz pętli, na przykład:
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
Kilka ciekawych miejsc:
- Naruszenie ograniczeń w bazie danych da Ci
ActiveRecord::RecordNotUniquebłąd zamiast podstawowegoPG::Error. AFAIK, otrzymaszPG::Errorjeśli rozmawiałeś bezpośrednio z bazą danych, zamiast przechodzić przez ActiveRecord. - Zastąp
INDEX_NAME_GOES_HEREz prawdziwą nazwą unikalnego indeksu. - Chcesz zignorować tylko oczekiwane naruszenie ograniczeń, stąd
next if(...)bit, po którym następuje bezargumentoweraise(tj. ponownie zgłoś wyjątek, jeśli nie jest to to, czego oczekujesz).