sql >> Base de Datos >  >> RDS >> PostgreSQL

Rails 3 ignora la excepción de restricción única de Postgres

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:

  1. Una violación de restricción dentro de la base de datos le dará un ActiveRecord::RecordNotUnique error en lugar del PG::Error subyacente . AFAIK, obtendrías un PG::Error si estuviera hablando directamente con la base de datos en lugar de pasar por ActiveRecord.
  2. Reemplazar INDEX_NAME_GOES_HERE con el nombre real del índice único.
  3. Solo desea ignorar la violación de restricción específica que está esperando, por lo tanto, el next if(...) bit seguido del raise sin argumentos (es decir, vuelva a generar la excepción si no es lo que esperaba ver).