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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top