Nói chung, việc xử lý ngoại lệ của bạn phải ở điểm gần nhất với lỗi mà bạn có thể làm điều gì đó hợp lý với ngoại lệ. Trong trường hợp của bạn, bạn muốn rescue
bên trong vòng lặp của bạn, ví dụ:
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
Một số điểm quan tâm:
- Vi phạm ràng buộc bên trong cơ sở dữ liệu sẽ cung cấp cho bạn
ActiveRecord::RecordNotUnique
chứ không phải làPG::Error
cơ bản . AFAIK, bạn sẽ nhận đượcPG::Error
nếu bạn đang nói chuyện trực tiếp với cơ sở dữ liệu thay vì thông qua ActiveRecord. - Thay thế
INDEX_NAME_GOES_HERE
với tên thật của chỉ mục duy nhất. - Bạn chỉ muốn bỏ qua vi phạm ràng buộc cụ thể mà bạn đang mong đợi, do đó
next if(...)
theo sau là bitraise
không đối số (tức là nêu lại ngoại lệ nếu đó không phải là điều bạn mong đợi).