我有几个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个关联表来说,这将是大量的工作。有没有更好的办法来解决这个问题?
uniq
选项并没有努力阻止重复的添加-如果关联被加载,它会检查对象是否已经在那里,但它不会加载关联只是为了检查。
最简单的事情可能是挽救ActiveRecord::RecordNonUnique
并适当地处理它-无论您的ruby级别检查多么仔细,总是有机会被数据库捕获竞争条件