关联表上的has_and_belongs_to_many和唯一索引生成“重复条目”失败

时间:2011-12-27 11:43:23

标签: ruby-on-rails activerecord ruby-on-rails-3.1 associations

我有几个has_and_belongs_to_many关联,我还在关联中使用uniq选项来避免与重复键相关的MySQL错误。我的关联是这样的:

has_and_belongs_to_many :people, :uniq => true

我添加的索引是我添加的分割主键​​:

add_index :table_name, [:key_1, :key_2], :unique => true

在关联的两侧。但是当我尝试将对象关联两次时,我的应用程序会抛出MySQL生成的Mysql2::Error: Duplicate entry '1-9' for key...错误。有没有一种聪明的方法来处理这个问题?

我已经考虑了几种可能的解决方案,但并不聪明。我考虑过使用:insert_sql选项手动更改INSERT查询,但对于20个关联表,这将是很多工作。有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:3)

uniq选项不会非常努力地防止添加重复项 - 如果加载关联,它将检查对象是否已经存在但是它不会加载关联来检查。

最简单的事情可能就是拯救ActiveRecord::RecordNonUnique并妥善处理它 - 无论你的红宝石级别检查多么小心,总是有可能被数据库捕获的竞争条件