In generale, la gestione delle eccezioni dovrebbe essere nel punto più vicino all'errore che puoi fare qualcosa di sensato con l'eccezione. Nel tuo caso, vorresti il tuo rescue
all'interno del tuo ciclo, ad esempio:
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
Un paio di punti di interesse:
- Una violazione del vincolo all'interno del database ti darà un
ActiveRecord::RecordNotUnique
errore anziché il sottostantePG::Error
. AFAIK, otterresti unPG::Error
se stavi parlando direttamente con il database invece di passare attraverso ActiveRecord. - Sostituisci
INDEX_NAME_GOES_HERE
con il nome reale dell'indice univoco. - Vuoi solo ignorare la specifica violazione del vincolo che ti aspetti, quindi
next if(...)
bit seguito daraise
senza argomenti (ad esempio, solleva nuovamente l'eccezione se non è ciò che ti aspetti di vedere).