如何从HABTM关联中完全和部分删除记录

时间:2017-08-01 06:04:25

标签: ruby-on-rails associations delete-row ruby-on-rails-5

我有与HABTM关系相关的导轨模型ArticleUser。即,User可以包含多篇文章,而Article可以属于多个User。 我很难删除记录。我的要求是:

  • 如果用户删除了与其他任何用户无关的文章,我想完全删除该文章,即删除Article表中的文章以及Article所有其他表格中的文章与has_many关联相关联(我还有与ArticleLinks模型相关联的其他模型,如ArticleMetaTagsArticle等。
  • 如果Article也与其他User相关联,则不要完全删除该文章。只需删除UserArticle关联。

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:0)

您始终可以在before_destroy ArticleUser(联接模型)的回调中实现它:

class ArticleUser
  belongs_to :article
  belongs_to :user

  after_destroy do
    article.destroy if article.article_users.empty?
  end
end

您需要创建它,如果您没有,请将has_and_belongs_to_many更改为has_many

class Article
  has_many :article_users
  has_many :users, through: :article_users
end

class User
  has_many :article_users
  has_many :articles, through: :article_users
end

这是更多的代码,但为您提供更多的灵活性。

但我建议在某个服务类中实现它,例如:

class ArticleUsers::Delete
  attr_accessor :article_user

  def initialize(article_user)
    self.article_user = article_user
  end

  def destroy
    if article_user.destroy
      article_user.article.destroy
    end
  end
end

然后在ArticleUsers::Delete.new(article_user).destroy

所需的任何地方拨打电话

作为预防措施,如果您没有任何明确的删除文章的逻辑,则可以在restrict_with_exception类中将article_users添加到Article关联。如果存在任何关联记录,则会引发异常。

class Article
  has_many :article_users, dependent: :restrict_with_exception
end