根据 Rails 官方文档 所说,假如 table 中某个 field 建立了 unique key index,那么插入重复值(比如重复的 email)时就会抛 ActiveRecord::RecordNotUnique 异常。这个重复值的检查是在数据库级别进行的。
与此同时,大家平时用的比较多的方法是 validates_uniqueness_of,其实现方式是在 model validation 阶段以 find by field 查询数据库中是否存在重复值。由于 validation 和最终写入存在时间差,在高并发的情况下这种 validation 很不可靠。(所以无论如何都必须捕捉 ActiveRecord::RecordNotUnique 异常?)
我的问题:
既然 validates_uniqueness_of 不可靠,为什么不省掉这一步,直接捕捉(可能会抛出的)ActiveRecord::RecordNotUnique 异常?
在什么地方处理这个异常比较合适(controller 还是 model)?最好能统一处理所有 model 的 ActiveRecord::RecordNotUnique 异常。