update tutorial rails inner includes active ruby-on-rails ruby database activerecord

ruby on rails - tutorial - delete_all vs destroy_all?



ruby on rails tutorial (4)

He creado una pequeña joya que puede aliviar la necesidad de eliminar manualmente los registros asociados en algunas circunstancias.

Esta gema agrega una nueva opción para las asociaciones de ActiveRecord:

dependiente:: delete_recursively

Cuando destruye un registro, todos los registros que están asociados con esta opción se eliminarán recursivamente (es decir, a través de los modelos), sin instanciar ninguno de ellos.

Tenga en cuenta que, al igual que dependent:: delete o dependent:: delete_all, esta nueva opción no desencadena las devoluciones de llamada around / before / after_destroy de los registros dependientes.

Sin embargo, es posible tener dependiente:: asociaciones de destrucción en cualquier lugar dentro de una cadena de modelos que de otra manera están asociados con dependiente:: delete_recursively. La opción: destroy funcionará normalmente en cualquier lugar arriba o abajo de la línea, creando instancias y destruyendo todos los registros relevantes y, por lo tanto, también activando sus devoluciones de llamadas.

Estoy buscando el mejor enfoque para eliminar registros de una tabla. Por ejemplo, tengo un usuario cuyo ID de usuario se encuentra en muchas tablas. Quiero eliminar este usuario y cada registro que tenga su ID en todas las tablas.

u = User.find_by_name(''JohnBoy'') u.usage_indexes.destroy_all u.sources.destroy_all u.user_stats.destroy_all u.delete

Esto funciona y elimina todas las referencias del usuario de todas las tablas, pero escuché que destroy_all era muy pesado en el proceso, así que probé delete_all . Solo elimina al usuario de su propia tabla de usuarios y el id de todas las demás tablas se vuelve nulo, pero deja intactos los registros. ¿Puede alguien compartir cuál es el proceso correcto para realizar una tarea como esta?

Veo que destroy_all llama a la función de destroy en todos los objetos asociados, pero solo quiero confirmar el enfoque correcto.


Para evitar el hecho de que destroy_all instancias de todos los registros y los destruye de uno en uno, puede usarlos directamente de la clase de modelo.

Entonces, en lugar de:

u = User.find_by_name(''JohnBoy'') u.usage_indexes.destroy_all

Tu puedes hacer :

u = User.find_by_name(''JohnBoy'') UsageIndex.destroy_all "user_id = #{u.id}"

El resultado es una consulta para destruir todos los registros asociados


Tienes razón. Si desea eliminar el usuario y todos los objetos asociados -> destroy_all Sin embargo, si solo desea eliminar el usuario sin suprimir todos los objetos asociados -> delete_all

De acuerdo con esta publicación: Rails: dependent =>: destroy VS: dependent =>: delete_all

  • destroy / destroy_all : los objetos asociados se destruyen junto a este objeto llamando a su método de destrucción
  • delete / delete_all : todos los objetos asociados se destruyen inmediatamente sin llamar a su método: destroy

delete_all es una sola instrucción SQL DELETE y nada más. destroy_all llama a destroy () en todos los resultados coincidentes de: condiciones (si tiene una) que podrían ser al menos NUM_OF_RESULTS sentencias SQL.

Si tiene que hacer algo drástico como destroy_all () en un gran conjunto de datos, probablemente no lo haría desde la aplicación y lo manejaría manualmente con cuidado. Si el conjunto de datos es lo suficientemente pequeño, no te dolería tanto.