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::RecordNotUniquechứ không phải làPG::Errorcơ bản . AFAIK, bạn sẽ nhận đượcPG::Errornế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_HEREvớ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à bitraisekhô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).