Я ищу лучший подход для удаления записей из таблицы. Например, у меня есть пользователь, чей идентификатор во многих таблицах. Я хочу удалить этого пользователя и каждую запись, которая имеет его идентификатор во всех таблицах.
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
все остальные таблицы обнуляются, но оставляют записи в них нетронутыми. Может кто-нибудь поделиться тем, что правильный процесс для выполнения такой задачи?
Я вижу, что destroy_all
вызывает destroy
функцию на всех связанных объектах, но я просто хочу подтвердить правильный подход.
delete_all
, и 2)destroy_all
создает все записи и уничтожает их по одной за раз, поэтому при очень большом наборе данных это может быть мучительно медленным.delete_all - это отдельный оператор SQL DELETE и ничего более. destroy_all вызывает destroy () для всех совпадающих результатов: условий (если они у вас есть), которые могут быть как минимум NUM_OF_RESULTS SQL-операторами.
Если вам нужно сделать что-то радикальное, например destroy_all () для большого набора данных, я бы, вероятно, не сделал бы это из приложения и не обработал бы это вручную с осторожностью. Если набор данных достаточно мал, вам не будет так больно.
источник
Чтобы избежать того факта, что
destroy_all
создаются все записи и уничтожаются по одной за раз, вы можете использовать их непосредственно из класса модели.Так что вместо:
Ты можешь сделать :
В результате один запрос уничтожает все связанные записи
источник
UsageIndex.destroy_all
эквивалентенUsageIntex.delete_all
?UsageIndex.destroy_all
больше не доступен, так как рельсы 3Я сделал небольшой драгоценный камень, который может облегчить необходимость вручную удалять связанные записи в некоторых обстоятельствах.
источник