[Ruby-On-Rails] delete_all vs destroy_all?



Answers

delete_all - это единственный оператор SQL DELETE и ничего больше. destroy_all вызывает destroy () для всех соответствующих результатов: условий (если они есть), которые могут быть как минимум NUM_OF_RESULTS SQL-инструкций.

Если вам нужно сделать что-то серьезное, такое как destroy_all () в большом наборе данных, я бы, вероятно, не сделал этого из приложения и ручку его вручную с осторожностью. Если набор данных достаточно мал, вы не пострадали бы.

Question

Я ищу лучший способ удалить записи из таблицы. Например, у меня есть пользователь, чей идентификатор пользователя находится во многих таблицах. Я хочу удалить этого пользователя и каждую запись со своим идентификатором во всех таблицах.

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 во всех связанных объектах, но я просто хочу подтвердить правильный подход.




Я сделал небольшой камень, который может облегчить необходимость вручную удалять связанные записи в некоторых случаях.

Этот жемчуг добавляет новый вариант для ассоциаций ActiveRecord:

зависимый:: delete_recursive

Когда вы уничтожаете запись, все записи, связанные с этой опцией, будут рекурсивно удаляться (т. Е. Через модели) без создания каких-либо из них.

Обратите внимание, что так же, как depend:: delete или depend:: delete_all, эта новая опция не вызывает обратные вызовы around / before / after_destroy зависимых записей.

Тем не менее, возможно иметь зависимые:: уничтожать ассоциации в любой цепочке моделей, которые в противном случае связаны с зависимыми:: delete_recursively. Опция: destroy будет нормально работать в любом месте вверх или вниз по линии, создавая и уничтожая все соответствующие записи и тем самым также вызывая их обратные вызовы.






Links