2009-09-09 7 views
47

Apparemment dépendant => destroy est ignoré lors de l'utilisation de l'option: through.dependent => détruire dans une association "has_many through"

J'ai donc ce ...

class Comment < ActiveRecord::Base 
    has_many :comment_users, :dependent => :destroy 
    has_many :users, :through => :comment_users 
    ... 
end 

... mais la suppression d'un commentaire ne donne pas lieu dans les enregistrements comment_user associés se supprimé.

Quelle est l'approche recommandée, par conséquent, pour les suppressions en cascade lors de l'utilisation de: through?

Merci

Répondre

96

Apparemment, la dépendance n'est pas ignorée!

Le vrai problème était que j'appelais Comment.delete(id) qui va directement à la base de données, alors que maintenant j'utilise Comment.destroy(id) qui charge l'objet Comment et appelle destroy() dessus. Cela ramasse le :dependent => :destroy et tout va bien.

+0

En effet! J'ai eu un problème similaire sauf que je recevais des erreurs de clé étrangère même si j'utilisais 'dependent:: destroy'. Le problème était que j'utilisais 'obj.delete' au lieu de' obj.destroy' donc les dépendants n'étaient pas supprimés, donc l'erreur d'intégrité. –

11

La solution de l'affiche originale est valide, mais je voulais souligner que cela ne fonctionne que si vous avez une colonne id pour cette table. Je préfère que mes tables many-to-many ne soient que les deux clés étrangères, mais j'ai dû supprimer mon "id: false" de la définition de la table de migration pour mettre en cascade delete pour travailler. Avoir cette fonctionnalité l'emporte définitivement sur l'absence d'une colonne id sur la table.

+0

Merci! Je viens de passer une demi-journée à essayer de comprendre cela par moi-même. – Tintin81

+2

vous da réel mvp – jed

5

Si vous avez une association polymorphique, vous devez faire ce que @blogofsongs dit, mais avec un attribut foreign_key comme ceci:

class User < ActiveRecord::Base 
    has_many :activities , dependent: :destroy, foreign_key: :trackable_id 
end