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::RecordNotUniqueerror plutôt que lePG::Errorsous-jacent . AFAIK, vous obtiendrez unPG::Errorsi vous parliez directement à la base de données plutôt que de passer par ActiveRecord. - Remplacer
INDEX_NAME_GOES_HEREavec 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 duraisesans argument (c'est-à-dire relancer l'exception si ce n'est pas ce que vous vous attendez à voir).