Generelt bør din undtagelseshåndtering være tættest på fejlen, at du kan gøre noget fornuftigt med undtagelsen. I dit tilfælde vil du gerne have din rescue
inde i din løkke, for eksempel:
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
Et par interessepunkter:
- En overtrædelse af begrænsninger inde i databasen vil give dig en
ActiveRecord::RecordNotUnique
fejl snarere end den underliggendePG::Error
. AFAIK, du vil få enPG::Error
hvis du talte direkte til databasen i stedet for at gå gennem ActiveRecord. - Erstat
INDEX_NAME_GOES_HERE
med det rigtige navn på det unikke indeks. - Du ønsker kun at ignorere den specifikke overtrædelse af begrænsninger, som du forventer, derfor
next if(...)
bit efterfulgt af den argumentløseraise
(dvs. genhæv undtagelsen, hvis det ikke er det, du forventer at se).