Rails-Whenever gem-динамические значения
допустим, у меня есть такая работа:
every 1.day, :at => '4:30 am' do
runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end
хотя, я хотел бы сделать '1.день " более динамичный, например, изменение значения через форму на странице администрирования.
тогда это может выглядеть так:
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 %>
3 ответов
Я никогда не пробовал, но вы должны быть в состоянии сделать это, загрузив среду Rails во всякий раз, когда вы можете использовать свои классы моделей. Просто используйте require File.dirname(__FILE__) + "./environment"
(или "./application"
для рельсов 3) в вашем расписании.rb, предполагая ваше расписание.РБ в папку с настройками.
однако, поскольку все, когда это происходит, генерирует строки в crontab, любые изменения, внесенные в any Constant
потребует выполнения whenever --update-crontab
снова.
спасибо idlefingers! Это сработало. Вот мое решение:
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
.значение может содержать например: 1.день или в воскресенье
.additional_data содержит метку времени, например: 11:00 часов
и да, я знаю, что мне нужно работать --обновить crontab еще раз:)
Но я позволю cronjob обновить себя, хе-хе.
# 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