Dans les guides de rails, il est décrit comme ceci:
Les objets seront en outre détruits s'ils sont associés à
:dependent => :destroy
, et supprimés s'ils sont associés à:dependent => :delete_all
Bien, cool. Mais quelle est la différence entre être détruit et supprimé? J'ai essayé les deux et il semble faire la même chose.
ruby-on-rails
ruby
model
associations
Sergey
la source
la source
Sur une association de modèle Rails, vous pouvez spécifier l'
:dependent
option, qui peut prendre l'une des trois formes suivantes::destroy/:destroy_all
Les objets associés sont détruits à côté de cet objet en appelant leurdestroy
méthode:delete/:delete_all
Tous les objets associés sont détruits immédiatement sans appeler leur:destroy
méthode:nullify
Toutes les clés étrangères des objets associés sont définies surNULL
sans appeler leurssave
rappelsla source
:restrict
. S'il est défini sur: restreindre, cet objet ne peut pas être supprimé s'il a un objet associé.:delete
ou des:destroy_all
options par son apparence? L'option: dépendante attend soit: destroy,: delete_all,: nullify ou: restrict (: delete):delete
et les:destroy_all
options n'existent pas. Cependant, il existe des méthodes de classe sur les modèles qui sont appeléesdelete
etdestroy_all
cela pourrait donc être la raison de la confusion.See destroy supprime ses éléments associés où delete_all peut supprimer plusieurs données de la table self comme
DELETE * FROM table where field = 'xyz'
: Options possibles dépendantes:
Contrôle ce qui arrive aux objets associés lorsque leur propriétaire est détruit. Notez que ceux-ci sont implémentés en tant que rappels, et Rails exécute les rappels dans l'ordre. Par conséquent, d'autres rappels similaires peuvent affecter le comportement: dépendant et le
:dependent
comportement peut affecter d'autres rappels.:destroy
provoque la destruction de tous les objets associés.:delete_all
provoque la suppression directe de tous les objets associés de la base de données (les callbacks ne seront donc pas exécutés).:nullify
provoque la mise à NULL des clés étrangères. Les rappels ne sont pas exécutés.:restrict_with_exception
provoque la levée d'une exception s'il existe des enregistrements associés.:restrict_with_error
provoque l'ajout d'une erreur au propriétaire s'il existe des objets associés.Si vous utilisez cette
:through
option, l'association sur le modèle de jointure doit être une appartenance à, et les enregistrements qui sont supprimés sont les enregistrements de jointure, plutôt que les enregistrements associés.la source
En fait, la principale différence est que les rappels ne seront pas appelés lorsqu'ils ont
:delete_all
été utilisés. Mais lorsqu'elle est utilisée,:destroy
la pile de rappels (:after_destroy
,:after_commit
...) sera déclenchée.Par conséquent, si vous avez des
touch:
déclarations dans les modèles en cours de suppression, il est préférable d'utiliserdependent: :delete_all
plutôt «depend:: destroy».la source