RoR: Zerstören Verbindung mit has_many,: durch, wenn verwaisten
-
20-09-2019 - |
Frage
Bei Ryan Bates großes Tutorial auf virtuellen Attribute , wie würde ich gehe über einen Tag (nicht Tagging) zu zerstören, wenn, sobald der Artikel zerstört wird, wird der Tag nicht mehr verwendet?
Ich habe versucht, so etwas wie dies zu tun:
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
... aber das ist nicht zu funktionieren scheint (die Tags existieren noch, nachdem der Artikel gelöscht wird, auch wenn keine anderen Artikel verwendet sie). Was soll ich dies zu tun tun?
Lösung
In Ihrer remove_orphaned_tags
Methode, was "Tags", dass Sie einen each
tun auf?
Würden Sie nicht brauchen wie Tag.all
?
Andere Tipps
JRL ist richtig. Hier ist der richtige Code.
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
ich weiß, ist es zu spät Art und Weise, sondern auch für Menschen, die das gleiche Problem auftreten, dies ist meine Lösung:
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