En general, su manejo de excepciones debe estar en el punto más cercano al error en el que puede hacer algo sensato con la excepción. En tu caso, querrías tu rescue
dentro de tu ciclo, por ejemplo:
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 par de puntos de interés:
- Una violación de restricción dentro de la base de datos le dará un
ActiveRecord::RecordNotUnique
error en lugar delPG::Error
subyacente . AFAIK, obtendrías unPG::Error
si estuviera hablando directamente con la base de datos en lugar de pasar por ActiveRecord. - Reemplazar
INDEX_NAME_GOES_HERE
con el nombre real del índice único. - Solo desea ignorar la violación de restricción específica que está esperando, por lo tanto, el
next if(...)
bit seguido delraise
sin argumentos (es decir, vuelva a generar la excepción si no es lo que esperaba ver).