удалить все против уничтожить все?



Я ищу лучший подход для удаления записей из таблицы. Например, у меня есть пользователь, чей идентификатор пользователя находится во многих таблицах. Я хочу удалить этого пользователя, и каждая запись имеет свой 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 функция на всех связанных объектах, но я просто хочу, чтобы подтвердить правильный подход.

676   4  

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

    Ничего не найдено.