2009-11-16 2 views
1

Ryan Bates's great tutorial on Virtual Attributes이 주어지면 일단 기사가 삭제되면 해당 태그가 더 이상 사용되지 않으면 어떻게 태그 (태그가 없음)가 삭제 될까요? RoR : has_many와의 연관성 제거, : 통해 분리 된 고아

나는이 같은 일을 시도 :

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 

...하지만 (기사를 삭제 한 후 태그가 여전히 다른 문서를 사용하지하더라도, 존재) 작동하지 않습니다. 이것을 성취하기 위해 내가 무엇을해야만 하는가?

답변

2

remove_orphaned_tags 방법에서 each을 수행하는 "태그"는 무엇인가요?

Tag.all과 같은 것이 필요하지 않습니까?

+0

감사합니다; 아마도'tags '는'self.tags'라고 가정했을 것입니다. 어쨌든 어쨌든 작동하지 않았을 것입니다 (오, 수면 부족 ...). – neezer

3

JRL이 맞습니다. 올바른 코드가 있습니다.

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 
+0

기사가 삭제 될 때마다 태그를 정리하는 것이 성능에 미치는 영향을 고려 했습니까? 이를 수행하기 위해 SQL 스크립트를 실행하는 cron 작업을 고려할 수 있습니다. –

+0

응용 프로그램에 따라 다릅니다. 가끔 기사가 삭제되는 경우 일정에 따라 작업을 실행하는 것보다 더 효율적일 수 있습니다! 또한 그는 Rails에서 작업 중이므로 Rake 작업을 cron 작업으로 설정하여 응용 프로그램의 일관성과 패키지를 유지할 것을 권장합니다. –

0

내가 너무 늦게 방법입니다,하지만 같은 문제가 발생하는 사람들을 알고, 이 내 솔루션입니다 :

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