Ruby on rails Mysql2::错误:键的重复项--ActiveRecord::RecordNotUnique未捕获错误?

Ruby on rails Mysql2::错误:键的重复项--ActiveRecord::RecordNotUnique未捕获错误?,ruby-on-rails,ruby-on-rails-3,exception-handling,Ruby On Rails,Ruby On Rails 3,Exception Handling,我正在使用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::Recor

我正在使用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
问题在于我的
user\u place.rb中没有用户id、地点id和关系的
验证唯一性?


据我了解,,
ActiveRecord:RecordNotUnique
应该捕获此错误,因为事务不满足数据库级别的索引约束。

不太确定添加
验证
的唯一性有什么问题,但是如果您确实不想使用它,并且您说
rescue
没有捕获异常,尝试同时删除
ActiveRecord::RecordNotUnique=>e
,看看它是否捕获了这种情况下的异常

请尝试以下操作:

rescue Exception => e
  if e.is_a? ActiveRecord::RecordNotUnique
    Rails.logger.warn(e)
  end
报告说:

将此验证方法与
ActiveRecord::Validations#save
不保证没有 重复的记录插入,因为
唯一性
检查
应用程序级别天生容易受到竞争条件的影响。对于
例如,假设两个用户试图在同一时间发布评论
时间,并且注释的标题必须是唯一的。在数据库级别上
这些用户执行的操作可以在以下情况下交错进行
态度

是的,除了数据库级别的约束外,您还应该具有
验证唯一性。