3

私はいくつかの関連付けを持っており、重複キーとの関係でMySQLエラーを避けるために関連でuniqオプションも使用しました。私の団体は、このようなものです:私は追加has_and_belongs_to_関連テーブルの一意索引で「重複エントリ」が生成されない

has_and_belongs_to_many :people, :uniq => true 

インデックスは、私が使用して追加分割主キーです:assocationの両側に

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

。しかし、オブジェクトを2回アソシエートしようとすると、MySQLによって生成されたMysql2::Error: Duplicate entry '1-9' for key...エラーがスローされます。この問題に対処するスマートな方法はありますか?

私はいくつかの可能な解決策を考えましたが、それほどスマートではありません。 :insert_sqlオプションを使用して手動でINSERTクエリを変更することを考えましたが、これは20の関連テーブルで多くの作業になります。これに対処するより良い方法はありますか?

答えて

3

uniqオプションは、重複が追加されるのを防ぐのが非常に難しくありません。アソシエーションがロードされていれば、オブジェクトがすでにそこにあるかどうかをチェックしますが、チェックするだけでアソシエーションをロードしません。

最も簡単な方法は、おそらくActiveRecord::RecordNonUniqueを救出することであり、適切に対処しない - に関係なく、あなたのルビーレベルのチェックは常に

+1

どのようにすることができ、データベースによって引っ掛かり競合状態の可能性があるように起こっているか注意してください物事を乾燥状態に保つために中央の位置でこれを行うのですか?私は20の異なる場所でこのエラーを再現したくない – davidb

+0

この質問の新しいスレッドを開く=> http://stackoverflow.com/questions/8644577/how-to-rescue-exception-central-and-dry – davidb

関連する問題