Je recherche la meilleure approche pour supprimer des enregistrements d'une table. Par exemple, j'ai un utilisateur dont l'ID utilisateur figure sur de nombreuses tables. Je veux supprimer cet utilisateur et chaque enregistrement qui a son ID dans toutes les tables.
u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
u.sources.destroy_all
u.user_stats.destroy_all
u.delete
Cela fonctionne et supprime toutes les références de l'utilisateur de toutes les tables, mais j'ai entendu dire que le destroy_all
processus était très lourd, alors j'ai essayé delete_all
. Il supprime uniquement l'utilisateur de sa propre table utilisateur et le id
de toutes les autres tables est rendu nul, mais laisse les enregistrements intacts. Quelqu'un peut-il partager le processus correct pour effectuer une tâche comme celle-ci?
Je vois que cela destroy_all
appelle la destroy
fonction sur tous les objets associés mais je veux juste confirmer la bonne approche.
la source
delete_all
, et 2)destroy_all
instancie tous les enregistrements et les détruit un à la fois, donc avec un très grand ensemble de données, cela pourrait être très lent.delete_all est une seule instruction SQL DELETE et rien de plus. destroy_all appelle destroy () sur tous les résultats correspondants de: conditions (si vous en avez une) qui pourraient être au moins NUM_OF_RESULTS instructions SQL.
Si vous devez faire quelque chose de radical comme destroy_all () sur un grand ensemble de données, je ne le ferais probablement pas à partir de l'application et je le gérerais manuellement avec soin. Si l'ensemble de données est suffisamment petit, vous ne feriez pas autant de mal.
la source
Pour éviter d'
destroy_all
instancier tous les enregistrements et de les détruire un par un, vous pouvez l'utiliser directement à partir de la classe de modèle.Donc au lieu de:
u = User.find_by_name('JohnBoy') u.usage_indexes.destroy_all
Tu peux faire :
u = User.find_by_name('JohnBoy') UsageIndex.destroy_all "user_id = #{u.id}"
Le résultat est une requête pour détruire tous les enregistrements associés
la source
UsageIndex.destroy_all
équivalent àUsageIntex.delete_all
?UsageIndex.destroy_all
n'est plus disponible depuis rails 3J'ai créé un petit bijou qui peut alléger la nécessité de supprimer manuellement les enregistrements associés dans certaines circonstances.
la source