Pergunta

Dado O ótimo tutorial de Ryan Bates sobre atributos virtuais, como eu destruiria uma tag (não marcando) se, uma vez que o artigo for destruído, essa tag não for mais usada?

Eu tentei fazer algo assim:

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

... Mas isso não parece funcionar (as tags ainda existem após a exclusão do artigo, mesmo que nenhum outro artigo as use). O que devo fazer para conseguir isso?

Foi útil?

Solução

Na tua remove_orphaned_tags método, o que é "tags" que você faz um each sobre?

Você não precisaria gostar Tag.all ?

Outras dicas

JRL está correto. Aqui está o código adequado.

 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

Eu sei que é tarde demais, mas para as pessoas que encontram o mesmo problema, esta é a minha solução:

 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top