PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Rails 3 ignora exceção de restrição exclusiva do Postgres


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:
  1. Uma violação de restrição dentro do banco de dados fornecerá um ActiveRecord::RecordNotUnique error em vez do PG::Error subjacente . AFAIK, você receberia um PG::Error se você estivesse falando diretamente com o banco de dados em vez de passar pelo ActiveRecord.
  2. Substituir INDEX_NAME_GOES_HERE com o nome real do índice exclusivo.
  3. Você só quer ignorar a violação de restrição específica que está esperando, daí o next if(...) bit seguido pelo raise sem argumentos (ou seja, re-aumente a exceção se não for o que você espera ver).