удалить все против уничтожить все?
Я ищу лучший подход для удаления записей из таблицы. Например, у меня есть пользователь, чей идентификатор пользователя находится во многих таблицах. Я хочу удалить этого пользователя, и каждая запись имеет свой ID во всех таблицах.
u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
u.sources.destroy_all
u.user_stats.destroy_all
u.delete
это работает и удаляет все ссылки пользователя из всех таблиц, но я слышал, что destroy_all был очень тяжелый процесс, поэтому я попробовал delete_all. Он только удаляет пользователя из его собственной таблицы пользователей и id из всех остальных таблиц сделаны null, но оставляет записи в них нетронутыми. Может ли кто-нибудь поделиться тем, что правильный процесс для выполнения такой задачи?
Я вижу destroy_all называет destroy функция на всех связанных объектах, но я просто хочу, чтобы подтвердить правильный подход.
4 ответов:
вы правы. Если вы хотите удалить пользователя и все связанные с ним объекты ->
destroy_allОднако, если вы просто хотите удалить пользователя без подавления всех связанных объектов ->delete_allсогласно этому сообщению:Rails: dependent =>: destroy VS: dependent =>: delete_all
destroy/destroy_all: связанные объекты уничтожаются вместе с этим объектом, вызывая их метод уничтоженияdelete/delete_all: все связанные объекты будут немедленно уничтожены, не называя их :уничтожить методом
delete_all-это один оператор SQL DELETE и ничего больше. destroy_all вызывает destroy () на все совпадающие результаты :условия (если у вас есть), которые могут быть по крайней мере num_of_results SQL-операторы.
Если вам нужно сделать что-то радикальное, такое как destroy_all() на большом наборе данных, я бы, вероятно, не делал этого из приложения и обрабатывал его вручную с осторожностью. Если набор данных достаточно мал, вам не будет так больно.
чтобы избежать того, что
destroy_allсоздает экземпляры всех записей и уничтожает их по одному, вы можете использовать его непосредственно из класса модели.Так вместо:
u = User.find_by_name('JohnBoy') u.usage_indexes.destroy_allвы можете сделать :
u = User.find_by_name('JohnBoy') UsageIndex.destroy_all "user_id = #{u.id}"результат один запрос, чтобы уничтожить все связанные с ним записи
этот камень добавляет новую опцию для ActiveRecord ассоциаций:
зависимые: :delete_recursively
при уничтожении записи все записи, связанные с помощью этой опции, будут удалены рекурсивно (т. е. по моделям), без создания экземпляра любой из них.
обратите внимание, что, просто как и dependent: :delete или dependent:: delete_all, этот новый параметр не вызывает обратные вызовы around/before/after_destroy зависимых записей.
тем не менее, можно иметь зависимые: :уничтожить ассоциации в любом месте в цепочке моделей, которые в противном случае связаны с зависимым: :delete_recursively. Опция: destroy будет работать нормально в любом месте вверх или вниз по линии, создавая и уничтожая все соответствующие записи и, таким образом, также вызывая их обратный вызов.
Comments