RoR: уничтожить ассоциацию с has_many: через если сирота - PullRequest
1 голос
/ 16 ноября 2009

Учитывая Великий учебник Райана Бейтса по виртуальным атрибутам , как бы мне было уничтожить тег (не тегирование), если после уничтожения статьи этот тег больше не используется?

Я пытался сделать что-то вроде этого:

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 ]

3 голосов
/ 16 ноября 2009

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
2 голосов
/ 16 ноября 2009

В вашем remove_orphaned_tags методе, что за «теги» вы делаете each на?

Разве тебе не нужно как Tag.all?

0 голосов
/ 10 ноября 2013

я знаю, что уже слишком поздно, но для людей, которые сталкиваются с той же проблемой, это мое решение:

 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
...