【问题标题】:Automatically delete all records after 30 days30天后自动删除所有记录
【发布时间】:2016-08-17 22:19:33
【问题描述】:

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

【问题讨论】:

  • 为什么没有宝石?你已经在 Rails 中使用了大量的它们。您将需要某种定期任务运行器。您可以手动执行此操作,或者如果您在可以管理的服务器上,您可以只 cron 一个 rake 任务。或者使用已经解决了这个众所周知的问题的几个 gem 中的任何一个。
  • 好点子,我猜如果宝石的目标是这样做的话,它们会受到欢迎。我对 Rails 有点陌生。

标签: ruby-on-rails


【解决方案1】:

在 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)

【讨论】:

    【解决方案2】:

    有几个选项可以实现这一点:

    1. Whenever 并运行脚本或 rake 任务
    2. Clockwork 并运行脚本或 rake 任务
    3. 在我看来是“rails 方式”的后台工作。

    对于 1,2,您需要每天检查记录是否存在 30 天,如果没有真正的布尔值则将其删除(这意味着,检查所有记录或每天优化查询并仅检查 30天旧记录等...)。对于第 3 个选项,您可以安排记录创建、在 30 天后运行的作业并独立检查每条记录。这取决于您如何处理作业,例如,如果您使用 sidekiq,则可以使用 scheduled jobs 或者如果您使用 resque check resque-scheduler

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 这还是很概念化的。我只想在每个月/30 天后自动 删除 所有 记录,除非它们具有真正的布尔属性。我不希望它们在 30 天后被单独删除。如果有人在第 29 天添加了一条记录,该记录将在第二天删除。
      • @MateoC 根据您的评论更新了示例查询
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        相关资源
        最近更新 更多