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::RecordNotUniqueerror en lugar delPG::Errorsubyacente . AFAIK, obtendrías unPG::Errorsi estuviera hablando directamente con la base de datos en lugar de pasar por ActiveRecord. - Reemplazar
INDEX_NAME_GOES_HEREcon 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 delraisesin argumentos (es decir, vuelva a generar la excepción si no es lo que esperaba ver).