5

我正在开发一个 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_ofuser_id、place_id 和关系user_place.rb吗?

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

4

2 回答 2

5

医生

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

于 2013-07-27T15:56:39.943 回答
2

不太确定添加有什么问题,validates_uniqueness_of但是如果您真的不想使用它并且您说rescue没有捕获异常,请尝试将ActiveRecord::RecordNotUnique => e所有内容一起删除,看看它是否在这种情况下捕获了异常。

尝试以下操作:

rescue Exception => e
  if e.is_a? ActiveRecord::RecordNotUnique
    Rails.logger.warn(e)
  end
于 2013-03-06T22:20:20.343 回答