【问题标题】:Rails - Whenever gem - Dynamic valuesRails - 每当 gem - 动态值
【发布时间】:2011-06-03 21:32:20
【问题描述】:

假设我有一个这样的 cronjob:

every 1.day, :at => '4:30 am' do  
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"  
end  

不过,我想让“1.day”更具动态性,例如通过管理页面中的表单更改值。

那么它可能看起来像这样:

every Constant.find(2).value, :at => '4:30 am' do 

@const = Constant.find(2)
every @const.span, :at => @const.time do 

任何人都可以提出如何使这项工作的想法吗?

显然,这样做的原因是我可以在我的网站上使用存储在数据库中的值,就像一条消息说

<%= "The next update is in less than #{@const.time}" #or something similar %>

【问题讨论】:

    标签: ruby-on-rails ruby cron gem whenever


    【解决方案1】:

    谢谢闲手们!它完全奏效了。这是我的解决方案:

    require "#{RAILS_ROOT}/config/environment.rb"
    
    @notification_daily = Constant.find_by_key("notification_daily_time_span")
    every eval(@notification_daily.value), :at => @notification_daily.additional_data do
      runner "Notification.daily"
    end
    
    @notification_weekly = Constant.find_by_key("notification_weekly_time_span")
    every eval(@notification_weekly.value), :at => @notification_weekly.additional_data do
      runner "Notification.weekly"
    end
    

    .value 可以包含例如:1.day:sunday
    .additional_data 包含时间戳,例如:11:00am

    是的,我知道我需要再次运行 --update crontab :)
    但是我会让一个 cronjob 自己更新,呵呵。

    【讨论】:

    • 这在 Rails4 中对我不起作用。 require 语句不起作用。知道我需要改变什么吗?
    • 我自己还没试过Rails 4,但是我觉得RAILS_ROOT改成Rails.root了。
    • @Frexuz :这条线是什么意思,你能帮我摆脱它吗? notification_weekly = Constant.find_by_key("notification_weekly_time_span") - 还有什么是 notification_weekly_time_span
    • @SSR 这只是我自己的模型,我可以通过我的管理 UI 进行更改。这是一个具有valueadditional_data 的模型,能够动态生成一个Whenever 行。您可以获取任何您想要的数据,只要它的值转换为任何有效的 When 值。如我的回答所述:.value 可以包含例如:1.day:sunday .additional_data 包含时间戳,例如:11:00am
    • @Frexuz 感谢您提供信息。但我仍然很困惑如何实现这一目标。你能帮助我吗?你能分享你的代码还是列出步骤?
    【解决方案2】:

    我从未尝试过,但您应该能够通过在任何时候加载 Rails 环境来做到这一点,以便您可以使用您的模型类。假设您的 schedule.rb 在配置目录中,只需在 schedule.rb 中使用 require File.dirname(__FILE__) + "./environment"(或 "./application" 用于 Rails 3)。

    但是,由于所有操作都是在 crontab 中生成行,因此对任何 Constant 所做的任何更改都需要再次运行 whenever --update-crontab

    【讨论】:

      【解决方案3】:
      # In rails 4
      require File.expand_path('../..//config/environment.rb', __FILE__)
      
      # This is your table by which you will get your new value 
      bid_update = DynamicOfferTime.first
      
      # Now Task As
      every (bid_update.hour_value).hours do
        puts "This will repeat in every #{bid_update.hour_value} hour"
      end
      

      别忘了随时更新

      【讨论】:

      • 我也使用 rails 4,require "#{RAILS_ROOT}/config/environment.rb" 在这里可以正常工作。
      • 谢谢,但是我遇到了这个问题并通过上述方法解决了。
      【解决方案4】:

      我有同样的任务,并决定用另一种方法来解决它。 在我的表中有很多记录,其中存储计划设置 (每天、每月、每周、时间)

      schedule.rb 文件中,我添加了一个每天00:00 运行的cron 作业并选择今天可以运行的记录。然后使用perform_at将它添加到sidekiq队列中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-01
        • 2011-06-04
        • 2016-04-11
        • 1970-01-01
        • 2014-12-18
        相关资源
        最近更新 更多