Obecně by vaše zpracování výjimek mělo být co nejblíže k chybě, že můžete s výjimkou udělat něco rozumného. Ve vašem případě budete chtít svou rescue
uvnitř vaší smyčky, například:
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
Pár zajímavostí:
- Porušením omezení v databázi získáte
ActiveRecord::RecordNotUnique
chyba spíše než základníPG::Error
. AFAIK, dostanetePG::Error
pokud jste mluvili přímo s databází místo toho, abyste procházeli ActiveRecord. - Nahraďte
INDEX_NAME_GOES_HERE
se skutečným názvem jedinečného indexu. - Chcete ignorovat pouze konkrétní porušení omezení, které očekáváte, proto
next if(...)
bit následovaný argumentemraise
(tj. znovu aktivujte výjimku, pokud to není to, co očekáváte).