RoR: Destroy association avec has_many,: par si devenus orphelins
-
20-09-2019 - |
Question
grand tutoriel de Ryan Bates sur les attributs virtuels , comment Je vais à détruire une étiquette (non Tagging) si, une fois que l'article est détruit, cette étiquette n'est plus utilisé?
J'ai essayé de faire quelque chose comme ceci:
class Article < ActiveRecord::Base
...
after_destroy :remove_orphaned_tags
private
def remove_orphaned_tags
tags.each do |tag|
tag.destroy if tag.articles.empty?
end
end
end
... mais cela ne semble pas fonctionner (les balises existent encore après l'article est supprimé, même si aucun autre article les utilise). Que dois-je faire pour y parvenir?
La solution
Dans la méthode remove_orphaned_tags
, ce qui est "tags" que vous faites un each
sur?
Souhaitez-vous pas besoin comme Tag.all
?
Autres conseils
JRL est correct. Voici le code approprié.
class Article < ActiveRecord::Base
...
after_destroy :remove_orphaned_tags
private
def remove_orphaned_tags
Tag.find(:all).each do |tag|
tag.destroy if tag.articles.empty?
end
end
end
Je sais qu'il est trop tard, mais pour les personnes qui rencontrent le même problème, voici ma solution:
class Article < ActiveRecord::Base
...
around_destroy :remove_orphaned_tags
private
def remove_orphaned_tags
ActiveRecord::Base.transaction do
tags = self.tags # get the tags
yield # destroy the article
tags.each do |tag| # destroy orphan tags
tag.destroy if tag.articles.empty?
end
end
end
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow