Les rails empêchent la suppression de l'enfant à moins que les parents soient supprimés également
-
26-12-2019 - |
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.
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.