我有几个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个关联表,这将是很多工作。有没有更好的方法来解决这个问题?
答案 0 :(得分:3)
uniq
选项不会非常努力地防止添加重复项 - 如果加载关联,它将检查对象是否已经存在但是它不会加载关联来检查。
最简单的事情可能就是拯救ActiveRecord::RecordNonUnique
并妥善处理它 - 无论你的红宝石级别检查多么小心,总是有可能被数据库捕获的竞争条件