我正在使用rails应用程序并且经常遇到以下错误:
Mysql2::Error: Duplicate entry '3022093-2000000028003-visited' for key 'unique_user_place_relationship'
虽然我已将问题的根源缩小到以下几行:
begin
up = UserPlace.new(user_place_params)
up.skip_logging
up.save!
rescue ActiveRecord::RecordNotUnique => e
Rails.logger.warn(e)
end
在我的表格中,我有以下索引:
key_name seq_in_index column_name
unique_user_place_relationship 1 user_id
unique_user_place_relationship 2 place_id
unique_user_place_relationship 3 relationship
问题是我的validate_uniqueness_of
中没有user_place.rb
user_id,place_id和关系?
根据我的理解,ActiveRecord:RecordNotUnique
应该捕获此错误,因为事务不符合db级别的索引约束。
答案 0 :(得分:5)
doc说:
结合使用此验证方法
ActiveRecord::Validations#save
不保证没有 重复记录插入,因为uniqueness
检查 应用程序级别本身就容易出现竞争条件。对于 例如,假设两个用户尝试在同一时间发布评论 时间,评论的标题必须是唯一的。在数据库级, 这些用户执行的操作可以在下面交错 方式...
答案 1 :(得分:2)
不太确定添加validates_uniqueness_of
会出现什么问题,但是如果你真的不想使用它,并且你说rescue
没有捕获异常,请尝试删除{{1所有在一起,看看它是否在这种情况下捕获异常。
尝试以下内容:
ActiveRecord::RecordNotUnique => e