РоР:Уничтожьте ассоциацию с has_many, :through, если осиротел
-
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
Не связан с StackOverflow