Secara umum, penanganan pengecualian Anda harus berada pada titik terdekat dengan kesalahan sehingga Anda dapat melakukan sesuatu yang masuk akal dengan pengecualian. Dalam kasus Anda, Anda ingin rescue di dalam loop Anda, misalnya:
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
Beberapa tempat menarik:
- Pelanggaran batasan di dalam database akan memberi Anda
ActiveRecord::RecordNotUniquekesalahan daripadaPG::Erroryang mendasarinya . AFAIK, Anda akan mendapatkanPG::Errorjika Anda berbicara langsung ke database daripada melalui ActiveRecord. - Ganti
INDEX_NAME_GOES_HEREdengan nama asli dari indeks unik. - Anda hanya ingin mengabaikan pelanggaran batasan spesifik yang Anda harapkan, oleh karena itu
next if(...)bit diikuti olehraise. tanpa argumen (yaitu menaikkan kembali pengecualian jika tidak seperti yang Anda harapkan).