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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top