Рельсы предотвращают удаление потомка, если родитель не удаляется также

В 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 ничего не удаляется. Есть ли способ сообщить этому методу, если причиной вызова является удаление родителя?

Это странная вещь, чтобы спросить? Я имею в виду предотвращение удаления детей.

1 ответ

Решение

Работа с ответом карпа от Rails: как отключить обратный вызов before_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

Мы должны были сделать это, потому что мы используем Паранойю, и dependent: delete_all будет трудно удалить, а не удалить их. Моя интуиция говорит мне, что есть лучший способ сделать это, но это не очевидно, и это делает работу.

Другие вопросы по тегам