Estou procurando a melhor abordagem para excluir registros de uma tabela. Por exemplo, eu tenho um usuário cujo ID do usuário está em várias tabelas. Quero excluir este usuário e todos os registros que tenham seu ID em todas as tabelas.
u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
u.sources.destroy_all
u.user_stats.destroy_all
u.delete
Isso funciona e remove todas as referências do usuário de todas as tabelas, mas ouvi dizer que o destroy_all
processo era muito pesado, então tentei delete_all
. Ele remove apenas o usuário de sua própria tabela de usuários e as id
de todas as outras tabelas são tornadas nulas, mas deixa os registros intactos nelas. Alguém pode compartilhar qual é o processo correto para executar uma tarefa como esta?
Vejo que destroy_all
chama a destroy
função em todos os objetos associados, mas só quero confirmar a abordagem correta.
fonte
delete_all
e 2)destroy_all
instancia todos os registros e os destrói um de cada vez; portanto, com um conjunto de dados muito grande, isso pode ser dolorosamente lento.delete_all é uma única instrução SQL DELETE e nada mais. destroy_all chama destroy () em todos os resultados correspondentes de: conditions (se você tiver um) que poderia ser pelo menos NUM_OF_RESULTS instruções SQL.
Se você tiver que fazer algo drástico, como destroy_all () em um grande conjunto de dados, provavelmente não faria isso no aplicativo e manipularia manualmente com cuidado. Se o conjunto de dados for pequeno o suficiente, você não machucaria tanto.
fonte
Para evitar o fato de que
destroy_all
instancia todos os registros e os destrói um de cada vez, você pode usá-lo diretamente da classe de modelo.Então, em vez de:
Você pode fazer :
O resultado é uma consulta para destruir todos os registros associados
fonte
UsageIndex.destroy_all
equivalente aUsageIntex.delete_all
?UsageIndex.destroy_all
não está mais disponível desde os trilhos 3Fiz uma pequena jóia que pode aliviar a necessidade de excluir manualmente os registros associados em algumas circunstâncias.
fonte