Рельсы предотвращают удаление потомка, если родитель не удаляется также
В 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
будет трудно удалить, а не удалить их. Моя интуиция говорит мне, что есть лучший способ сделать это, но это не очевидно, и это делает работу.