RoR:破坏与has_many的关联,通过if孤立

时间:2009-11-16 16:35:43

标签: ruby-on-rails has-many-through

鉴于Ryan Bates's great tutorial on Virtual Attributes,如果文章被销毁后标签不再使用,我将如何破坏标签(不标记)?

我尝试过这样的事情:

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

...但这似乎不起作用(删除文章后标签仍然存在,即使没有其他文章使用它们)。我应该怎么做才能做到这一点?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

remove_orphaned_tags方法中,each开启的“标记”是什么?

您不需要Tag.all吗?

答案 2 :(得分: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