Generellt sett bör din undantagshantering vara närmast felet att du kan göra något vettigt med undantaget. I ditt fall vill du ha din rescue inuti din loop, till exempel:
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
Ett par intressanta platser:
- En begränsningsöverträdelse inuti databasen ger dig en
ActiveRecord::RecordNotUniquefel snarare än det underliggandePG::Error. AFAIK, du skulle få ettPG::Errorom du pratade direkt till databasen istället för att gå igenom ActiveRecord. - Ersätt
INDEX_NAME_GOES_HEREmed det riktiga namnet på det unika indexet. - Du vill bara ignorera den specifika överträdelsen av begränsningen som du förväntar dig, därav
next if(...)bit följt av den argumentlösaraise(dvs återhöja undantaget om det inte är vad du förväntar dig att se).