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::RecordNotUnique
błąd zamiast podstawowegoPG::Error
. AFAIK, otrzymaszPG::Error
jeśli rozmawiałeś bezpośrednio z bazą danych, zamiast przechodzić przez ActiveRecord. - Zastąp
INDEX_NAME_GOES_HERE
z 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).