Em geral, seu tratamento de exceção deve estar no ponto mais próximo do erro que você pode fazer algo sensato com a exceção. No seu caso, você deseja que seu
rescue
dentro do seu loop, por exemplo: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
Alguns pontos de interesse:
- Uma violação de restrição dentro do banco de dados fornecerá um
ActiveRecord::RecordNotUnique
error em vez doPG::Error
subjacente . AFAIK, você receberia umPG::Error
se você estivesse falando diretamente com o banco de dados em vez de passar pelo ActiveRecord. - Substituir
INDEX_NAME_GOES_HERE
com o nome real do índice exclusivo. - Você só quer ignorar a violação de restrição específica que está esperando, daí o
next if(...)
bit seguido peloraise
sem argumentos (ou seja, re-aumente a exceção se não for o que você espera ver).