web-dev-qa-db-fra.com

dépendante => détruire sur une association "has_many through"

Apparemment dépendant => destroy est ignoré lorsque vous utilisez également l'option: through.

J'ai donc ça ...

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

... mais la suppression d'un commentaire n'entraîne pas la suppression des enregistrements comment_user associés.

Quelle est donc l'approche recommandée pour les suppressions en cascade lors de l'utilisation de: through?

Merci

48
blogofsongs

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 j'utilise maintenant Comment.destroy(id) qui charge l'objet Comment et appelle destroy () dessus. Cela ramasse le :dependent => :destroy et tout va bien.

96
blogofsongs

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 plusieurs-à-plusieurs 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 que la suppression en cascade fonctionne. Avoir cette fonctionnalité l'emporte définitivement sur le fait de ne pas avoir de colonne id sur la table.

11
drosis

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

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