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