2009-04-19 5 views
9

Avec un has_many régulier, il y a l'option de :dependent => :destroy pour supprimer les associations lorsque l'enregistrement parent est supprimé. Avec has_many :through, il peut y avoir d'autres parents associés aux enregistrements enfant, donc :dependent => :destroy n'a aucun effet.Détruire les associations après la dernière has_many: à travers l'enregistrement est supprimé

Comment vous assurez-vous que les enregistrements enfants sont supprimés après qu'ils sont devenus orphelins de la dernière association HMT?

Répondre

12

La solution que j'ai trouvé semble être un rappel after_destroy, comme ceci:

class Parent < ActiveRecord::Base 
    has_many :children, :through => :parentage 
    after_destroy :destroy_orphaned_children 

    private 

    def destroy_orphaned_children 
    children.each do |child| 
     child.destroy if child.parents.empty? 
    end 
    end 

end 
+0

Poke dans une vieille question/réponse, j'avais 'has_many: through' assocation; J'ai appelé 'destroy' sur le modèle Through, mais je voulais supprimer tout modèle de l'autre côté de l'association qui pourrait être orphelin. J'ai placé ce code à l'intérieur de mon modèle à travers, et puisque le modèle à la fin étant détruit était seulement un 'belongs_to', j'ai enlevé l'appel de' each' d'emballage. Merci pour la poussée dans la bonne direction. –

3

Sur la jointure modèle, utilisez "belongs_to: modèle, en fonction:: détruire"

par exemple, si vous voulez détruire un patient une fois que leur médecin est détruit, et les patients has_many médecin quoique rendez-vous

Class Appointment 
    belongs_to :doctor 
    belongs_to :patient, dependent: :destroy 

Class Doctor 
    has_many :appointments, dependent: :destroy 
    has_many :patients, through: :appointments 

Class Patient 
    has_many :appointments 
    has_many :doctors, through: :appointments 
+2

J'aime l'idée de détruire tous les patients :)) –

+0

Je veux détruire un patient seulement lorsque TOUS ses rendez-vous sont détruits. Tant qu'il reste au moins un rendez-vous, je veux que le patient reste en vie (sinon il ne viendra pas et ne paiera pas :-) Votre approche est-elle appropriée ou va-t-elle détruire le patient chaque fois que les rendez-vous sont détruits? – silverdr

Questions connexes