web-dev-qa-db-fra.com

Rails: dépendants =>: détruisez VS: dépendants =>: delete_all

Dans Rails guide cela est décrit comme suit:

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

C'est 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.

185
Sergey

La différence est avec le rappel.

Le :delete_all est faite directement dans votre application et supprimée par SQL:

DELETE * FROM users where compagny_id = XXXX

Avec le :destroy, il y a une instanciation de tous vos enfants. Donc, si vous ne pouvez pas le détruire ou si chacun a son propre :dependent, ses rappels peuvent être appelés.

194
shingara

Sur une association de modèle Rails, vous pouvez spécifier le :dependent, 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 leur méthode destroy
  • :delete/:delete_all Tous les objets associés sont détruits immédiatement sans appeler leur :destroy méthode
  • :nullify Les clés étrangères de tous les objets associés sont définies sur NULL sans appeler leurs rappels save
131
John Topley

Voir destroy supprime ses éléments associésdelete_all peut supprimer plusieurs données de la table self comme DELETE * FROM table where field = 'xyz'

: dépend des options possibles:

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 callbacks, et Rails exécute des callbacks dans l’ordre. Par conséquent, d’autres callbacks similaires peuvent affecter le comportement dépendant: et le :dependent le comportement peut affecter d'autres rappels.

:destroy provoque la destruction de tous les objets associés.

:delete_all entraîne la suppression directe de tous les objets associés dans la base de données (les rappels ne seront donc pas exécutés).

:nullify définit les clés étrangères sur NULL. Les rappels ne sont pas exécutés.

:restrict_with_exception provoque une exception si des enregistrements sont associés.

:restrict_with_error entraîne l’ajout d’une erreur au propriétaire s’il existe des objets associés.

Si vous utilisez avec le :through, l’association sur le modèle de jointure doit être un appart_to et les enregistrements supprimés sont les enregistrements de jointure plutôt que les enregistrements associés.

30
Manish Shrivastava

En réalité, la principale différence est que les rappels ne seront pas appelés lorsque :delete_all A été utilisé. Mais lorsqu'il est utilisé :destroy, La pile de rappels (:after_destroy, :after_commit ...) sera déclenchée.

Par conséquent, si vous avez des déclarations touch: Ing dans des modèles en cours de suppression, il vaut mieux utiliser dependent: :delete_all Plutôt 'dépendant:: détruire'.

2
atlascoder