Обработка повторяющихся задач в Rails

Я пытался создать индивидуальное приложение для ведения дел с возможностью добавления повторяющихся задач.

Мой первый подход состоял в том, чтобы использовать recurring_select спереди и логику ice_cube сзади. Мне удалось создать расписание со всеми желаемыми вхождениями, но проблема, с которой я столкнулся, заключается в том, что таким образом я больше не могу помечать повторяющуюся задачу как завершенную, поскольку отображается только ее вхождение.

Вот часть кода:

*task.rb*
class Task < ApplicationRecord
  (...)
  serialize :recurrence, Hash

  def recurrence=(value)
    # byebug
    if value != "null" && RecurringSelect.is_valid_rule?(value)
      super(RecurringSelect.dirty_hash_to_rule(value).to_hash)
    else
      super(nil)
    end
  end

  def rule
    IceCube::Rule.from_hash recurrence
  end

  def schedule(start)
    schedule = IceCube::Schedule.new(start)
    schedule.add_recurrence_rule(rule)
    schedule
  end

  def display_tasks(start)
    if recurrence.empty?
      [self]
    else
      start_date = start.beginning_of_week
      end_date = start.end_of_week
      schedule(start_date).occurrences(end_date).map do |date|
          Task.new(id: id, name: name, start_time: date)
      end
    end
  end
end  

*tasks_controller.rb*
class TasksController < ApplicationController
  before_action :set_task, only: [:complete, :uncomplete, :show]
  (...)
  def index
    (...)

    @display_tasks = @tasks.flat_map{ |t| t.display_tasks(params.fetch(:start_date, Time.zone.now).to_date ) }
  end
  (...)
end

Мне было интересно, может быть, есть лучший способ подойти к этому, чем использовать драгоценные камни? Я читал о планировании рейк-задач, но я никогда не делал этого сам, поэтому я не уверен, что это правильный путь.

Заранее спасибо.


person Joanna Gaudyn    schedule 14.10.2017    source источник


Ответы (1)


Да, есть лучший способ выполнять повторяющиеся задачи, используя rake tasks и каждый раз, когда gem. Он имеет чрезвычайно простой в использовании DSL

Все, что вам нужно сделать, это определить задачу rake, а затем поместить конфигурацию расписания в файл schedule.rb.

Однако всякий раз, когда используются задания cron, они не поддерживаются Heroku. Если вы используете Heroku, вам следует использовать планировщик Heroku. Все, что вам нужно сделать, это определить свои задачи в tasks/scheduler.rake, установить дополнение и позволить планировщику Heroku сделать все остальное.

Этот подход поможет сохранить ваши модели в чистоте и удалить из них информацию о расписании.

Что касается второй части вашего вопроса, которая помечает повторяющиеся задачи как завершенные, все, что вам нужно сделать, это установить логический атрибут, скажем, completed, равным true, когда повторяющаяся задача помечена как завершенная, а затем добавить защитное предложение в ваши rake-задачи, такие как return if task.completed?, чтобы пропустить обработку для этой задачи.

person Adim    schedule 15.10.2017
comment
Спасибо @Nwocha. Что касается второй части моего вопроса, хотя проблема возникла из-за того, что расписание Ice-Cube отображает только элемент, присутствующий в памяти, а не в вашей базе данных, но всегда будет ссылаться на исходную задачу, поэтому вы не можете обновить атрибуты вхождения . В итоге я использовал ActiveJob и использовал информацию о расписании кубиков льда только для условного планирования дублирования задач. - person Joanna Gaudyn; 16.10.2017