PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Rails 3 ignore l'exception de contrainte unique Postgres

En général, votre gestion des exceptions doit être au point le plus proche de l'erreur pour que vous puissiez faire quelque chose de sensé avec l'exception. Dans votre cas, vous voudriez votre rescue à l'intérieur de votre boucle, par exemple :

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

Quelques points d'intérêt :

  1. Une violation de contrainte dans la base de données vous donnera un ActiveRecord::RecordNotUnique error plutôt que le PG::Error sous-jacent . AFAIK, vous obtiendrez un PG::Error si vous parliez directement à la base de données plutôt que de passer par ActiveRecord.
  2. Remplacer INDEX_NAME_GOES_HERE avec le vrai nom de l'index unique.
  3. Vous voulez seulement ignorer la violation de contrainte spécifique que vous attendez, d'où le next if(...) bit suivi du raise sans argument (c'est-à-dire relancer l'exception si ce n'est pas ce que vous vous attendez à voir).