РоР:Уничтожьте ассоциацию с has_many, :through, если осиротел

StackOverflow https://stackoverflow.com/questions/1743306

  •  20-09-2019
  •  | 
  •  

Вопрос

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

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

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

...но, похоже, это не работает (теги все еще существуют после удаления статьи, даже если ни в одной другой статье они не используются).Что я должен делать, чтобы достичь этого?

Это было полезно?

Решение

В вашем remove_orphaned_tags метод, что такое "теги", которые вы делаете each включен?

Разве вам не нужно было бы, например Tag.all ?

Другие советы

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

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

 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top