每60天删除一次记录

时间:2012-12-20 15:27:10

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

如果记录距离created_at日期超过60天,我需要删除我的商品模型中的记录。

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

4 个答案:

答案 0 :(得分:16)

为任务创建一个文件:

# 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'

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

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

详细了解Github上的宝石。

答案 1 :(得分:8)

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

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

所以你需要使用&lt;查找比时间戳更早(更少)的记录。

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

这只是Unixmonkey的轻微疏忽。 我也使用delete_all而不是循环每个迭代块。

答案 2 :(得分:4)

您可以为商品模型创建rake task to delete expired offers或创建类方法,并使用例如whenever gem来调用它。

答案 3 :(得分:0)

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

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