3 votes

has_and_belongs_to_many et l'index unique sur la table d'association génère un échec "Duplicate entry".

J'ai plusieurs has_and_belongs_to_many et j'ai également utilisé les uniq dans les associations pour éviter les erreurs MySQL en relation avec les clés dupliquées. Mes associations sont comme ceci :

has_and_belongs_to_many :people, :uniq => true

L'index que j'ai ajouté est une clé primaire divisée que j'ai ajoutée en utilisant :

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

des deux côtés de l'assocation. Mais lorsque j'essaie d'associer deux fois un objet, mon application jette la commande Mysql2::Error: Duplicate entry '1-9' for key... qui est générée par MySQL. Existe-t-il un moyen intelligent de gérer ce problème ?

J'ai pensé à plusieurs solutions possibles mais elles ne sont pas intelligentes. J'ai pensé à modifier manuellement la requête INSERT en utilisant la fonction :insert_sql mais cela représenterait beaucoup de travail pour 20 tables d'association. Existe-t-il un meilleur moyen de traiter ce problème ?

3voto

Frederick Cheung Points 38410

En uniq n'essaie pas vraiment d'empêcher les doublons d'être ajoutés - si l'association est chargée, elle vérifiera si l'objet est déjà là, mais elle ne chargera pas l'association juste pour vérifier.

La chose la plus simple est probablement de sauver ActiveRecord::RecordNonUnique et de le traiter de manière appropriée - quel que soit le soin apporté à vos vérifications au niveau de ruby, il y aura toujours une chance qu'une condition de course soit détectée par la base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X