Le rotaie impediscono la cancellazione del bambino a meno che il genitore sia stato cancellato anche
-
26-12-2019 - |
Domanda
In rubino su rotaie 4, diciamo che un genitore ha molti figli.Quando il genitore viene cancellato, i bambini devono anche essere cancellati.A parte questo, il bambino non sarà cancellato a meno che non sia un orfano.Come farlo?
Ho provato con il seguente
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
.
Con il controllo prima_destroy, tuttavia, nulla viene cancellato.C'è un modo per raccontare questo metodo se il motivo di essere chiamato è dovuto alla cancellazione dei genitori?
È una cosa strana da chiedere?Voglio dire, prevenire la cancellazione dei bambini.
Soluzione
Lavorando dalla risposta della carpa da Rails: come disabilitare il callback prima_destroy quando viene distrutto a causa del genitore viene distrutto (: dipendente=>: Destroy) , prova questo:
Bambino:
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
.
Genitore:
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
.
Abbiamo dovuto farlo perché stiamo usando Paranoia e dependent: delete_all
DURE DURE-Elimina anziché eliminarli morbidi.Il mio intestino mi dice che c'è un modo migliore per farlo, ma non è ovvio, e questo ottiene il lavoro fatto.