PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Rails 3 ignora l'eccezione di vincolo univoco di Postgres

In generale, la gestione delle eccezioni dovrebbe essere nel punto più vicino all'errore che puoi fare qualcosa di sensato con l'eccezione. Nel tuo caso, vorresti il ​​tuo rescue all'interno del tuo ciclo, ad esempio:

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 paio di punti di interesse:

  1. Una violazione del vincolo all'interno del database ti darà un ActiveRecord::RecordNotUnique errore anziché il sottostante PG::Error . AFAIK, otterresti un PG::Error se stavi parlando direttamente con il database invece di passare attraverso ActiveRecord.
  2. Sostituisci INDEX_NAME_GOES_HERE con il nome reale dell'indice univoco.
  3. Vuoi solo ignorare la specifica violazione del vincolo che ti aspetti, quindi next if(...) bit seguito da raise senza argomenti (ad esempio, solleva nuovamente l'eccezione se non è ciò che ti aspetti di vedere).