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::RecordNotUnique
kesalahan daripadaPG::Error
yang mendasarinya . AFAIK, Anda akan mendapatkanPG::Error
jika Anda berbicara langsung ke database daripada melalui ActiveRecord. - Ganti
INDEX_NAME_GOES_HERE
dengan 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).