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