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.
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.
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
Voir 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'
: 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.
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'.