1

有没有办法使用 rake 从数据库中删除除最后 30 个左右的结果之外的所有结果?我是否必须获取数据库计数,从 30 开始检查结果,然后删除之前创建日期的所有内容?

4

1 回答 1

5

当然,按照您的建议进行操作:

delete_all_but_oldest_30.rake:

task :delete_all_but_oldest_30 => :environment do
  query = MyModel.order("created_at desc")
  query.limit(query.count - 30).destroy_all
end

您应该根据自己的需要自定义它——您只需要确定“最后一个”的含义:最旧、最高 ID、最低 ID 等。只需使用您想要的任何顺序的相反顺序,以便最后 30 个结果是那些你想保留的。因此,要保持最低的 ID,请按"id desc".


注意:这在技术上并不能保证准确地留下 30 条记录,因为它是非事务性的。当此 rake 任务运行时异步添加更多记录时,结果不确定。根据您的应用程序,这可能是也可能不是问题。如果您只是删除旧记录,我怀疑这个 rake 任务很好。如果没有,您可以将整个任务包装在transaction. 但是,如果您要删除大量记录,则不建议这样做,因为事务会占用数据库。

于 2013-06-13T15:43:27.967 回答