30天后自动删除所有记录

时间:2016-08-16 18:03:56

标签: ruby-on-rails

我有一个我想要的rails应用程序的概念。我想要一个用户可以使用布尔属性创建记录的模型。 30天/月后,除非记录具有真正的布尔属性,否则记录将自动删除。

4 个答案:

答案 0 :(得分:4)

在rails 5中,您可以访问“active_job”(http://guides.rubyonrails.org/active_job_basics.html

有两种简单的方法。

创建记录后,您可以将此作业设置为在30天后执行。此作业检查记录是否符合规范。

另一种方法是创建一个替代作业,每天运行一次,查询数据库中30天前创建的每个记录(此特定模型),如果它们与规范不匹配则销毁它们。 (如果在数据库上它应该很容易:MyModel.where(created_at:30.days.ago,destroyable:true).destroy_all)

答案 1 :(得分:0)

执行删除很简单:在有问题的记录类上创建一个类方法(例如Record.prune),该方法基于查询执行删除,例如: Record.destroy_all(retain: false)其中retain是您提到的布尔属性。我建议然后在lib/tasks中定义一个调用此方法的rake任务(例如)

namespace :record
  task :prune => :environment
    Record.prune
  end
end

调度更加困难; crontab条目足以提供正确的时间,但确保适当的环境(例如,加载rbenv / rvm和任何适当的环境变量的环境)更加困难。确保您的部署过程生成binstub可能在这里很有帮助。那里bin/rake record:prune应该足够了。如果不了解您希望完成此任务的所有环境,就很难提供更深入的答案。

答案 2 :(得分:0)

实现这一目标有两种选择:

  1. Whenever并运行脚本或佣金任务
  2. Clockwork并运行脚本或佣金任务
  3. 后台工作,在我看来是" rails方式"。
  4. 对于1,2你需要每天检查记录是否为30天,如果没有真正的布尔值则删除它(这意味着,每天检查所有记录或优化查询并仅检查30天的记录等...)。对于第3个选项,您可以安排创建记录,30天后运行的作业,并独立检查每个记录。这取决于您处理作业的方式,例如,如果您使用sidekiq,则可以使用scheduled jobs或使用resque check resque-scheduler

答案 3 :(得分:0)

我想提一下非Rails方法。这取决于您的数据库。当您使用mongodb时,您可以使用mongodb "Expire Data from Collections"功能。当您使用mysql时,您可以使用mysql事件调度程序。你可以在这里找到一个很好的例子What is the best way to delete old rows from MySQL on a rolling basis?