rails impede a exclusão do filho, a menos que o pai também esteja sendo excluído
-
26-12-2019 - |
Pergunta
em Ruby on Rails 4, digamos que um pai tenha muitos filhos.Quando o pai é excluído, os filhos também devem ser excluídos.Fora isso, a criança não será excluída, a menos que seja órfã.Como fazer isso?
Eu tentei com o seguinte
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
Com a verificação before_destroy, entretanto, nada é excluído.Existe alguma maneira de informar esse método se o motivo da chamada é a exclusão do pai?
É uma coisa estranha de se pedir?Quero dizer, impedindo a exclusão de crianças.
Solução
Trabalhando a partir da resposta da carpa em Trilhos:como desativar o retorno de chamada before_destroy quando ele está sendo destruído porque o pai está sendo destruído (:dependent =>:destroy), tente isto:
Criança:
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
Pai:
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
Tivemos que fazer isso porque estamos usando a paranóia, e dependent: delete_all
iria excluí-los permanentemente em vez de excluí-los suavemente.Meu instinto me diz que há uma maneira melhor de fazer isso, mas não é óbvio, e isso dá conta do recado.