7

如果记录从 created_at 日期起超过 60 天,我需要删除我的报价模型中的记录。

我只找到了有关如何使用 rake 任务填充模型的信息,但找不到有关如何创建 rake 任务以删除记录的信息。所以我只是想知道我是否必须通过一项任务来执行此操作,或者 rails 是否还有其他事情可以执行此操作。

4

4 回答 4

20

为任务创建一个文件:

# lib/tasks/delete_old_records.rake
namespace :delete do
  desc 'Delete records older than 60 days'
  task :old_records => :environment do
    Model.where('created_at < ?', 60.days.ago).each do |model|
      model.destroy
    end

    # or Model.delete_all('created_at < ?', 60.days.ago) if you don't need callbacks
  end
end

运行:

RAILS_ENV=production rake delete:old_records

安排它使用 cron 运行(在本例中每天早上 8 点):

0 8 * * * /bin/bash -l -c 'cd /my/project/releases/current && RAILS_ENV=production rake delete:old_records 2>&1'

您还可以使用when gem 在部署时创建和管理您的crontab:

every 1.day, :at => '8:00 am' do
  rake "delete:old_records"
end

在Github上了解有关 gem 的更多信息。

于 2012-12-20T15:34:07.260 回答
12

60.days.ago 生成一个时间戳,如

Fri, 08 Aug 2014 15:57:18 UTC +00:00

因此,您需要使用 < 来查找比时间戳更早(更少)的记录。

Online.delete_all("created_at < '#{60.days.ago}'")

这只是 Unixmonkey 的一个小小的疏忽。我也会使用 delete_all 而不是在一个块中循环每个迭代。

于 2014-10-07T16:04:38.637 回答
4

您可以创建一个rake 任务来删除过期的商品,或者为您的商品模型创建类方法并调用它,例如,无论何时gem。

于 2012-12-20T15:33:24.577 回答
0

您可以在单个查询中删除所有超过 60 天的记录,如下所示:

Model.where("created_at < '#{60.days.ago}'").delete_all
于 2020-10-14T09:20:13.910 回答