【问题标题】:Running a daily script affecting the database运行影响数据库的每日脚本
【发布时间】:2015-09-06 20:44:02
【问题描述】:

我想编写一个脚本,我可以将 cron 配置为在我的 Rails 应用程序下每 24 小时运行一次。

script.rb

User.all.each do |user|
    days = user[:days]

    if days >= 1
        days = days - 1
    end

    user.update_attribute(:days, days)
end

但是,每当我运行它时,我都会收到此错误:

未初始化的常量用户(NameError)

怎么了?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    如果您在 Rails 应用程序的主目录中,那么只需:

    rails runner -e production script.rb
    

    对于 cron(假设 script.rb 又在 home dir 中):

    1. 找出您的bundle (which bundle) 的完整路径
    2. 在您的 crontab 中添加(相应地更改包和项目路径):

      0 * * * * cd /project_home && /bundle_executable exec rails runner -e production script.rb

    【讨论】:

    • main:Object (NameError) 的未定义局部变量或方法“脚本”
    • 你是从 Project 的主目录运行 rails runner script.rb 吗?
    • 不,我会从一个子目录中移动一些东西。
    • 现在我遇到了一个完全错误,fe_sendauth: no password provided (PG::ConnectionBad)
    • 看看你的config/database.yml,生产环境的密码是不是类似于<%= ENV[DATABASE_PASSWORD] %>
    【解决方案2】:

    另一种方法是在脚本顶部require_relative 'config/environment.rb'(调整您的用例的路径);性能会受到轻微影响,但如果您每天只运行一次,几秒钟的启动惩罚将无关紧要。

    另外,您可能需要适当地设置RAILS_ENV 才能访问正确的数据库表。

    【讨论】:

      【解决方案3】:

      我总是使用whenever 来管理我的 cron 作业。

      安装whenever,然后将以下脚本添加到您的config/schedule.rb

      every :day do
        runner 'User.all.each {|user| user.decrement!(:days) if user.days > 0}'
      end
      

      然后从您的终端运行whenever -w

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-25
        • 1970-01-01
        • 1970-01-01
        • 2014-12-05
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多