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::RecordNotUnique
fel snarare än det underliggandePG::Error
. AFAIK, du skulle få ettPG::Error
om du pratade direkt till databasen istället för att gå igenom ActiveRecord. - Ersätt
INDEX_NAME_GOES_HERE
med 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).