尝试就是否可以将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
时似乎工作正常,但我想批量删除。
答案 0 :(得分:2)
尝试:
Model.delete(Model.where(:account_id => account).order(:id).limit(1000).pluck(:id))
答案 1 :(得分:2)
这个对我(以及我的需要)也很好用
Model.connection.exec_delete('DELETE FROM models ORDER BY id LIMIT 10000', 'DELETE', [])
我知道它看起来有点麻烦,但它会返回受影响的行,并且通过rails logger 记录查询。 ;)
答案 2 :(得分:0)
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
答案 3 :(得分:0)
这是我用来删除数百万行的最佳解决方案:
sql = %{ DELETE FROM model WHERE where_clause LIMIT 1000 }
results = 1
while results > 0 do
results = ActiveRecord::Base.connection.exec_delete(sql)
end
这比在SQL中使用ID的批量删除要快得多。
答案 4 :(得分:-1)
或Model.where(:account_id => account).order(:id).limit(1000).map(&:delete)
,尽管如果您有数千条记录要删除/销毁,这不是最佳方法。
Model.delete_all()
似乎是最好的选择,因为它委托SQL选择记录并批量删除它们。