Mysql2 ::错误:密钥的重复条目 - ActiveRecord :: RecordNotUnique没有捕获错误?

时间:2013-03-06 19:51:09

标签: 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::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级别的索引约束。

2 个答案:

答案 0 :(得分:5)

doc说:

  

结合使用此验证方法   ActiveRecord::Validations#save不保证没有   重复记录插入,因为uniqueness检查   应用程序级别本身就容易出现竞争条件。对于   例如,假设两个用户尝试在同一时间发布评论   时间,评论的标题必须是唯一的。在数据库级,   这些用户执行的操作可以在下面交错   方式...

答案 1 :(得分:2)

不太确定添加validates_uniqueness_of会出现什么问题,但是如果你真的不想使用它,并且你说rescue没有捕获异常,请尝试删除{{1所有在一起,看看它是否在这种情况下捕获异常。

尝试以下内容:

ActiveRecord::RecordNotUnique => e