一般に、例外処理は、例外を使用して適切な処理を実行できるエラーに最も近いポイントで行う必要があります。あなたの場合、あなたはあなたのrescue
が欲しいでしょう ループ内の例:
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
いくつかの興味深い点:
- データベース内の制約違反により、
ActiveRecord::RecordNotUnique
が生成されます 基になるPG::Error
ではなくエラー 。 AFAIK、PG::Error
が表示されます ActiveRecordを経由せずに、データベースと直接通信している場合。 -
INDEX_NAME_GOES_HERE
を置き換えます 一意のインデックスの本名を使用します。 - 予期している特定の制約違反のみを無視したいので、
next if(...)
ビットの後に引数のないraise
(つまり、期待どおりでない場合は例外を再発生させます)。