【问题标题】:rails prevent deletion of child unless parent is being deleted also除非父级也被删除,否则rails会阻止删除子级
【发布时间】:2014-05-28 15:30:58
【问题描述】:

在 Ruby on Rails 4 中,假设父母有很多孩子。当父级被删除时,子级也必须被删除。除此之外,除非是孤儿,否则不得删除该孩子。该怎么做?

我尝试了以下

class Parent < ActiveRecord::Base
  has_many :children, inverse_of: :parent, dependent: :destroy
end

class Child < ActiveRecord::Base
  belongs_to :parent, inverse_of: :children
  before_destroy :checks
private
  def checks
    not parent # true if orphan
  end
end

但是,使用 before_destroy 检查,不会删除任何内容。如果被调用的原因是因为父删除,有什么方法可以告诉这个方法?

这是一个奇怪的要求吗?我的意思是,防止删除孩子。

【问题讨论】:

  • 除非您的应用程序包含直接删除子级的代码,否则应该无法直接删除它们,同时仍然可以在删除父级时删除它们。我不明白你是如何遇到这个问题的。你能说得更具体点吗?
  • 你是对的。谢谢。

标签: ruby-on-rails-4 has-and-belongs-to-many dependent-destroy


【解决方案1】:

根据 Rails: how to disable before_destroy callback when it's being destroyed because of the parent is being destroyed (:dependent => :destroy) 鲤鱼的回答,试试这个:

孩子:

belongs_to :parent
before_destroy :prevent_destroy
attr_accessor :destroyed_by_parent

...

private

def prevent_destroy
  if !destroyed_by_parent
    self.errors[:base] << "You may not delete this child."
    return false
  end
end

家长:

has_many :children, :dependent => :destroy
before_destroy :set_destroyed_by_parent, prepend: true

...

private

def set_destroyed_by_parent
  children.each{ |child| child.destroyed_by_parent = true }
end

我们必须这样做,因为我们使用的是 Paranoia,而dependent: delete_all 会硬删除而不是软删除它们。我的直觉告诉我有更好的方法可以做到这一点,但这并不明显,这可以完成工作。

【讨论】:

  • 我遇到了同样的问题,但有 has_one 关系。我以稍微不同的方式解决了,但我也觉得必须有更好的方法来做到这一点。 My solution
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
相关资源
最近更新 更多