Активная запись: delete_all с ограничением - PullRequest
4 голосов
/ 18 ноября 2011

Попытка получить окончательный ответ о том, можно ли ограничить число записей delete_all до X.

Я пытаюсь сделать следующее:

Model.where(:account_id => account).order(:id).limit(1000).delete_all

но, похоже, он не соответствует limit, а вместо этого просто удаляет всю модель, где :account_id => account.

Я ожидал бы, что это сгенерирует следующее:

delete from model where account_id = ? order by id limit 1000

Кажется, это нормально работает при использовании destroy_all, но я хочу удалить навалом.

Ответы [ 5 ]

2 голосов
/ 19 июня 2014

Этот тоже хорошо сработал для меня (и моих потребностей)

Model.connection.exec_delete('DELETE FROM models ORDER BY id LIMIT 10000', 'DELETE', [])

Я знаю, что это может показаться немного громоздким, но он вернет затронутые строки И также зарегистрирует запрос через регистратор rails . ;)

2 голосов
/ 18 ноября 2011

Попробуйте:

Model.delete(Model.where(:account_id => account).order(:id).limit(1000).pluck(:id))
1 голос
/ 06 июня 2019

Это было лучшее решение, которое я использовал для удаления миллионов строк:

sql = %{ DELETE FROM model WHERE where_clause LIMIT 1000 }

results = 1
while results > 0 do
  results = ActiveRecord::Base.connection.exec_delete(sql)
end

Это выполнялось намного быстрее, чем удаление в пакетах, где идентификаторы использовались в SQL.

0 голосов
/ 19 ноября 2011
ActiveRecord::Base.connection.send(:delete_sql,'delete from table where account_id = <account_id> limit 1000')

Вы должны использовать send, потому что 'delete_sql' защищен, но это работает.

Я обнаружил, что удаление 'order by' также значительно ускорило его.

Мне кажется странным, что использование .limit работает с destroy_all, но не delete_all

0 голосов
/ 18 ноября 2011

или Model.where(:account_id => account).order(:id).limit(1000).map(&:delete), хотя это не самый лучший подход, если у вас есть тысячи записей для удаления / уничтожения.

Model.delete_all() кажется лучшим вариантом, поскольку он делегирует SQL задачу выборазаписи и массовое их удаление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...