Im Allgemeinen sollte Ihre Ausnahmebehandlung so nahe am Fehler liegen, dass Sie mit der Ausnahme etwas Sinnvolles tun können. In Ihrem Fall möchten Sie Ihre rescue
innerhalb Ihrer Schleife, zum Beispiel:
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
Ein paar interessante Punkte:
- Eine Einschränkungsverletzung innerhalb der Datenbank gibt Ihnen einen
ActiveRecord::RecordNotUnique
Fehler statt des zugrunde liegendenPG::Error
. AFAIK, Sie würden einenPG::Error
erhalten wenn Sie direkt mit der Datenbank sprachen, anstatt über ActiveRecord zu gehen. - Ersetzen Sie
INDEX_NAME_GOES_HERE
mit dem echten Namen des eindeutigen Indexes. - Sie wollen nur die spezifische Beschränkungsverletzung ignorieren, die Sie erwarten, daher das
next if(...)
Bit gefolgt von dem argumentlosenraise
(d. h. die Ausnahme erneut auslösen, wenn es nicht das ist, was Sie erwarten).