删除除数据库中最后x行之外的所有行

时间:2013-06-13 15:26:29

标签: ruby-on-rails database rake delete-row

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

1 个答案:

答案 0 :(得分:3)

当然,按照你的建议做吧:

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中。但是,如果您要删除大量记录,那么这是不可取的,因为事务会占用数据库。