Question

Dans Ruby On Rails 4, disons qu'un parent a beaucoup d'enfants.Lorsque le parent est supprimé, les enfants doivent également être supprimés.Outre cela, l'enfant ne doit pas être supprimé à moins que ce ne soit orphelin.Comment faire ça?

J'ai essayé avec ce qui suit

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

avec le chèque avant_destroy, cependant, rien ne devient supprimé.Existe-t-il un moyen de dire cette méthode si la raison d'être appelée est parce que la suppression des parents?

Est-ce une chose étrange à demander?Je veux dire, empêchant la suppression des enfants.

Était-ce utile?

La solution

Travailler de la réponse de carpes de Rails: Comment désactiver le rappel avant_destroy lorsqu'il est détruit à cause du parent est en train d'être détruit (: dépendant=>: Détruire) , essayez ceci:

Enfant:

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

Parent:

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

Nous devions faire cela parce que nous utilisons la paranoïa et que dependent: delete_all serait fortement supprimé plutôt que de les supprimer.Mon gut me dit qu'il y a une meilleure façon de le faire, mais ce n'est pas évident, ce qui fait le travail.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top