活动记录:具有限制的delete_all

时间:2011-11-18 01:38:32

标签: ruby-on-rails-3 activerecord

尝试就是否可以将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 个答案:

答案 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'也显着加快了它的速度。

我确实认为使用.limitdestroy_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选择记录并批量删除它们。