Rails 5 调度程序每天更新一次数据库

Posted

技术标签:

【中文标题】Rails 5 调度程序每天更新一次数据库【英文标题】:Rails 5 scheduler to update database once a day 【发布时间】:2017-04-21 01:06:11 【问题描述】:

我是 Rails 新手,想每天在午夜运行一次批处理文件/计划任务,检查哪些条目已过期。表中的每条记录都有一个关闭日期,在此之后,此类记录必须处于非活动状态。(DB 上的状态活动 = false)。所以基本上它会运行 2 个 SQL 查询来获取所有记录,然后将另一个字段标记为不活动的记录已过时。我正在使用 Rails 5。

我应该如何处理这个-gem(rufus、whatever、clockwork 或任何其他 gem)或只是一些用于 cronjob 的系统工具?我要将我的数据库更改为 PostgreSQL,这会影响吗?任何人都可以分享任何建议或示例代码以获得想法。

【问题讨论】:

【参考方案1】:

简而言之:您可以为此目的使用whenever Gem。

您需要为编写 SQL 的位置创建一个 rake 任务。 然后将其安排为 cron 作业,使用时


详细解释

第一步是创建一个 rake 任务。您可以使用控制台执行此操作

rails g task my_namespace my_task1 

这将在lib/tasks 文件夹中创建一个名为my_namespace.rake 的文件,其初始内容类似于

namespace :my_namespace do
  desc "TODO"
  task task1: :environment do
    # Your code will go here
  end

end

你可以通过运行来检查你的任务是否正常运行

rake my_namespace:task1 

在控制台中。

现在您需要使用 whenever gem 来安排作业。

    gem 'whenever', :require => falseGemfile。 运行bundle install 在终端中运行wheneverize 命令。这将在 config 文件夹中创建一个 schedule.rb 文件。

    添加以下代码来安排您的 rake 任务:

    every 1.day, at: '8:00 pm' do
      rake "my_namespace:task1"
    end
    

    运行此命令:whenever --update-crontab。如果您的环境是开发环境,请使用命令:whenever --update-crontab --set environment='development'(参见this question。

    运行crontab -l检查是否添加了cron作业。

【讨论】:

如果您需要详细说明,请告诉我 好的,谢谢。因为文档只提供了一个概述,但我没有找到一个相关的例子来描述 SQL 命令将如何被写入 rake 命令......或批处理文件中的两个命令,然后与 runner 一起运行. 我已经更新了答案。如果您仍然面临问题,请告诉我

以上是关于Rails 5 调度程序每天更新一次数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何编写 Rake 任务以将数据导入 Rails 应用程序?

如果异步操作已成功获取数据并更新状态,则也仅调度一次操作

- 更新 - Rails API 应用程序使用来自控制器的 POST 请求一次创建不同模型的多个嵌套记录

任务计划程序未在应用程序中启动Excel

Rails 5:jquery用户输入数据不保存

Ruby-on-Rails 显示问题 - 2018 年 5 月仅存在一次,但我的应用程序显示了 7 次