ROR: Destrua a associação com Has_Many: através de se órfão
-
20-09-2019 - |
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?
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