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::RecordNotUniqueerrore anziché il sottostantePG::Error. AFAIK, otterresti unPG::Errorse stavi parlando direttamente con il database invece di passare attraverso ActiveRecord. - Sostituisci
INDEX_NAME_GOES_HEREcon il nome reale dell'indice univoco. - Vuoi solo ignorare la specifica violazione del vincolo che ti aspetti, quindi
next if(...)bit seguito daraisesenza argomenti (ad esempio, solleva nuovamente l'eccezione se non è ciò che ti aspetti di vedere).