PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rails 3 ignoriert Postgres Unique Constraint Exception

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:

  1. Eine Einschränkungsverletzung innerhalb der Datenbank gibt Ihnen einen ActiveRecord::RecordNotUnique Fehler statt des zugrunde liegenden PG::Error . AFAIK, Sie würden einen PG::Error erhalten wenn Sie direkt mit der Datenbank sprachen, anstatt über ActiveRecord zu gehen.
  2. Ersetzen Sie INDEX_NAME_GOES_HERE mit dem echten Namen des eindeutigen Indexes.
  3. Sie wollen nur die spezifische Beschränkungsverletzung ignorieren, die Sie erwarten, daher das next if(...) Bit gefolgt von dem argumentlosen raise (d. h. die Ausnahme erneut auslösen, wenn es nicht das ist, was Sie erwarten).