Quelle est la différence entre
@model.destroy
et @model.delete
Par exemple:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Est-ce vraiment important si j'utilise l'un ou l'autre?
la source
Quelle est la différence entre
@model.destroy
et @model.delete
Par exemple:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Est-ce vraiment important si j'utilise l'un ou l'autre?
Exécute essentiellement destroy
tous les rappels sur le modèle alors delete
qu'il ne le fait pas.
Depuis l' API Rails :
ActiveRecord::Persistence.delete
Supprime l'enregistrement dans la base de données et fige cette instance pour indiquer qu'aucune modification ne doit être apportée (car elles ne peuvent pas être persistées). Renvoie l'instance gelée.
La ligne est simplement supprimée avec une instruction SQL DELETE sur la clé primaire de l'enregistrement et aucun rappel n'est exécuté.
Pour appliquer les rappels before_destroy et after_destroy de l'objet ou toute option d'association dépendante, utilisez #destroy.
ActiveRecord::Persistence.destroy
Supprime l'enregistrement dans la base de données et fige cette instance pour indiquer qu'aucune modification ne doit être apportée (car elles ne peuvent pas être persistées).
Il y a une série de rappels associés à destroy. Si le rappel before_destroy renvoie false, l'action est annulée et destroy renvoie false. Voir ActiveRecord :: Callbacks pour plus de détails.
model#before_destroy
qui peut être utilisé pour interrompre l'destroy()
appel final sous certaines conditions.delete
supprimera uniquement l'enregistrement d'objet actuel de la base de données, mais pas les enregistrements enfants associés de la base de données.destroy
supprimera l'enregistrement d'objet actuel de db et également son enregistrement enfant associé de db.Leur utilisation compte vraiment:
Si vos objets parents multiples partagent des objets enfants communs, l'appel
destroy
à un objet parent spécifique supprimera les objets enfants qui sont partagés entre d'autres parents multiples.la source
destroy
est descendant , pas enfant : selon la documentation, destroy "crée un nouvel objet à partir des attributs, puis appelle destroy dessus". rubydoc.info/docs/rails/4.1.7/ActiveRecord%2FRelation:destroyLorsque vous invoquez
destroy
oudestroy_all
sur unActiveRecord
objet, leActiveRecord
processus de `` destruction '' est lancé, il analyse la classe que vous supprimez, il détermine ce qu'il doit faire pour les dépendances, exécute les validations, etc.Lorsque vous appelez
delete
oudelete_all
sur un objet,ActiveRecord
essaie simplement d'exécuter laDELETE FROM tablename WHERE conditions
requête sur la base de données, sans effectuer d'autresActiveRecord
tâches de niveau.la source
Oui, il existe une différence majeure entre les deux méthodes Utilisez delete_all si vous souhaitez que les enregistrements soient supprimés rapidement sans que les rappels de modèle soient appelés
Si vous vous souciez des rappels de vos modèles, utilisez destroy_all
Des documents officiels
http://apidock.com/rails/ActiveRecord/Base/destroy_all/class
la source
Fondamentalement, «supprimer» envoie une requête directement à la base de données pour supprimer l'enregistrement. Dans ce cas, Rails ne sait pas quels attributs sont dans l'enregistrement qu'il supprime ni s'il y a des rappels (tels que
before_destroy
).La méthode "destroy" prend l'ID transmis, récupère le modèle de la base de données en utilisant la méthode "find", puis appelle destroy à ce sujet. Cela signifie que les rappels sont déclenchés.
Vous voudrez utiliser "supprimer" si vous ne voulez pas que les rappels soient déclenchés ou si vous voulez de meilleures performances. Sinon (et la plupart du temps) vous voudrez utiliser "destroy".
la source
Beaucoup de réponses déjà; voulait sauter avec un peu plus.
documents :
Le
delete
verbage fonctionne différemment pourActiveRecord::Association.has_many
etActiveRecord::Base
. Pour ce dernier, delete exécuteraSQL DELETE
et contournera toutes les validations / rappels. Le premier sera exécuté en fonction de l':dependent
option transmise à l'association. Cependant, lors des tests, j'ai trouvé l'effet secondaire suivant où les rappels n'étaient exécutés que pourdelete
et nondelete_all
dependent: :destroy
Exemple:la source