Это не идеально, но я принял решение добавить переменную среды RUN_IF к граблям задач, запускаемых через heroku: планировщик, который позволяет мне составлять еженедельные и ежемесячные графики для заданий.
# lib/tasks/scheduler.rake
def run?
eval ENV.fetch('RUN_IF', 'true')
end
def scheduled
if run?
yield
else
puts "RUN_IF #{ENV['RUN_IF'].inspect} eval'd to false: aborting job."
end
end
# lib/tasks/job.rake
task :job do
scheduled do
# ...
end
end
Если задача граблейзапустить без переменной RUN_IF, он будет работать.В противном случае задание будет прервано, если значение RUN_IF не превратится в ложное значение.
$ rake job # => runs always
$ rake job RUN_IF='Date.today.monday?' # => only runs on Mondays
$ rake job RUN_IF='Date.today.day == 1' # => only runs on the 1st of the month
$ rake job RUN_IF='false' # => never runs (not practical, just demonstration)
Аналогично другим идеям выше, но я предпочитаю удалять детали планирования из кода приложения.