Over het algemeen moet uw afhandeling van uitzonderingen zo dicht mogelijk bij de fout liggen dat u iets verstandigs kunt doen met de uitzondering. In jouw geval wil je je rescue
in je lus, bijvoorbeeld:
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
Een paar aandachtspunten:
- Een schending van een beperking in de database geeft u een
ActiveRecord::RecordNotUnique
fout in plaats van de onderliggendePG::Error
. AFAIK, je krijgt eenPG::Error
als u rechtstreeks met de database praatte in plaats van door ActiveRecord te gaan. - Vervang
INDEX_NAME_GOES_HERE
met de echte naam van de unieke index. - U wilt alleen de specifieke schending van de beperking negeren die u verwacht, vandaar de
next if(...)
bit gevolgd door de argumentlozeraise
(d.w.z. verhoog de uitzondering als het niet is wat je verwacht te zien).