sql >> Databasteknik >  >> RDS >> PostgreSQL

Rails 3 ignorerar Postgres unika begränsningsundantag

Generellt sett bör din undantagshantering vara närmast felet att du kan göra något vettigt med undantaget. I ditt fall vill du ha din rescue inuti din loop, till exempel:

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

Ett par intressanta platser:

  1. En begränsningsöverträdelse inuti databasen ger dig en ActiveRecord::RecordNotUnique fel snarare än det underliggande PG::Error . AFAIK, du skulle få ett PG::Error om du pratade direkt till databasen istället för att gå igenom ActiveRecord.
  2. Ersätt INDEX_NAME_GOES_HERE med det riktiga namnet på det unika indexet.
  3. Du vill bara ignorera den specifika överträdelsen av begränsningen som du förväntar dig, därav next if(...) bit följt av den argumentlösa raise (dvs återhöja undantaget om det inte är vad du förväntar dig att se).


  1. Hur man implementerar ett dubbelriktat unikt index över flera kolumner

  2. Hur skapar jag ett tabellalias i MySQL

  3. Går ihop baserat på villkor i flera tabeller

  4. Frågar Oracle Clob-datatyp