Выполнение той же функции каждый понедельник в полночь - PullRequest
0 голосов
/ 20 января 2020

В Rails 5 у меня есть этот метод в контроллере "Aulas" ("Classes" по-португальски):

def set_week_classes
  classes = Aula.all.to_a
  @this_week_classes = classes.shift(2)
end

Учитывая, что "classes" - это массив, я бы хотел иметь "@ this_week_classes = classes.shift (2) "выполняется каждый понедельник в полночь (по бразильскому времени), получая следующие два элемента массива классов для отображения в представлении. Кроме того, мне бы хотелось, чтобы, когда он достиг конца массива, он просто начинался сначала, и "@this_week_classes" снова становились первыми двумя элементами массива классов. Как я мог это сделать? Спасибо!

Ответы [ 2 ]

1 голос
/ 20 января 2020

Вы можете использовать sidekiq с каким-либо гемом планирования (например, sidekiq-планировщик или sidekiq-cron ). В зависимости от вашей установки вы также можете скопировать с помощью rake task и периодически запускать его, используя cron . Если вы используете облако, то у вашего провайдера определенно есть какой-то планировщик.

Кстати, весь ваш исходный код, вероятно, должен быть на английском языке Engli sh. Смешивание некоторых португальских названий классов выглядит не очень хорошо и может сбить с толку других участников.

Но если ваша единственная цель - показать, какие классы перечислены на этой неделе, вероятно, лучше сделать что-то вроде этого:

classes = Aula.all.to_a # not the best for the memory
shift = DateTime.current.weeks_since(CONSTANT_TIME) % classes.size
@this_week_classes = ([classes]+[classes])[shift..(shift+2)] # [classes]+[classes] make sure that we won't get too little classes if we reach the and of the `classes` array
0 голосов
/ 20 января 2020

Похоже, вы задаете два вопроса одновременно:

  1. Запускать работу каждую неделю в определенное время.

Предложения Rails разные способы сделать это. Мне кажется, лучше всего подходит работа с активной библиотекой заданий.

Возможны следующие варианты:

Еще одна открытая библиотека для этого типа задач - гем delayed_job. Он не очень эффективен, но его легко включить в небольшие проекты.

Цикл массива элементов.

Здесь вместо фактического перемещения элементов из вашего массива существует возможность сохранить задание, выполненное в вашей базе данных. Имейте в виду, что есть и другие возможности, которые не требуют, чтобы вы изменили свою базу данных. Следующий код не тестируется, но должен рассматриваться как псевдокод.

def run_job
   last_aula_job = AulaJob.all.order(:created_at).last

   classes = Aula.all.to_a
   total = classes.count
   p = last_aula_job.last_pointer % count
   @this_week_classes = classes[p..p+1]

   # do something with @this_week_classes

   AulaJob.create(last_pointer: p + 2)
end
...