48 votes

dépendant => détruire sur une association "has_many through".

Apparemment, l'option dépendante => destroy est ignorée lorsqu'on utilise également l'option :through.

Donc j'ai ceci...

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 l'approche recommandée, alors, pour les suppressions en cascade lors de l'utilisation de :through ?

Gracias

97voto

blogofsongs Points 850

Apparemment :dépendant n'est pas ignoré !

Le vrai problème était que j'appelais Comment.delete(id) qui va directement dans le db, alors que j'utilise maintenant Comment.destroy(id) qui charge l'objet Commentaire et appelle destroy() sur celui-ci. Cette opération récupère l'objet :dependent => :destroy et tout va bien.

11voto

drosis Points 46

La solution de l'affiche originale est valable, 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 comportent que les deux clés étrangères, mais j'ai dû supprimer ma colonne "id : false" de la définition de la table de migration pour que la suppression en cascade fonctionne. Le fait d'avoir cette fonctionnalité l'emporte définitivement sur le fait de ne pas avoir de colonne id sur la table.

6voto

rizidoro Points 1993

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

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