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::RecordNotUniquefejl snarere end den underliggendePG::Error. AFAIK, du vil få enPG::Errorhvis du talte direkte til databasen i stedet for at gå gennem ActiveRecord. - Erstat
INDEX_NAME_GOES_HEREmed 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).