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::RecordNotUniquefout in plaats van de onderliggendePG::Error. AFAIK, je krijgt eenPG::Errorals u rechtstreeks met de database praatte in plaats van door ActiveRecord te gaan. - Vervang
INDEX_NAME_GOES_HEREmet 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).