2017-10-14 2 views
0

J'ai essayé de créer une application de tâches personnalisée avec la possibilité d'ajouter des tâches récurrentes.Gestion de tâches récurrentes dans Rails

Ma première approche était d'utiliser recurring_select sur la face avant et la logique ice_cube à l'arrière. J'ai réussi à générer un planning avec toutes les occurrences désirées mais le problème que j'ai rencontré est que de cette façon je ne peux plus marquer une tâche récurrente comme complète, car c'est seulement son occurrence qui est affichée.

Voici une partie du code:

*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 

Je me demandais s'il y a peut-être une meilleure façon de l'aborder que d'utiliser les pierres précieuses? Je lisais sur la planification des tâches de rake, mais je ne l'ai jamais fait moi-même, donc je ne suis pas sûr que ce soit la bonne façon de procéder.

Merci d'avance.

Répondre

1

Oui, il existe une meilleure façon d'effectuer des tâches récurrentes à l'aide de tâches rake et whenever gem. Il a un DSL extrêmement facile à utiliser

Tout ce que vous devez faire est de définir votre tâche de rake et ensuite mettre la configuration de la planification dans un schedule.rb. Cependant, chaque fois qu'il utilise des tâches cron et n'est pas supporté par Heroku. Si vous utilisez Heroku, vous devez utiliser Heroku Scheduler. Tout ce que vous devez faire est de définir vos tâches dans un tasks/scheduler.rake, installez l'addon et laissez Heroku Scheduler faire le reste. Cette approche permettra de garder vos modèles plus propres et de supprimer les informations de planification de leur part. Pour la deuxième partie de votre question qui indique que les tâches récurrentes sont terminées, tout ce que vous devez faire est de définir un attribut booléen: completed à true lorsque la tâche récurrente est marquée comme complète, puis ajouter une clause de garde dans votre rake des tâches telles que return if task.completed? pour ignorer le traitement de cette tâche.

+0

Merci @Nwocha. En ce qui concerne la deuxième partie de ma question, le problème provient du fait que la programmation de glaçons n'affiche qu'un élément présent dans la mémoire, pas dans votre base de données, mais renvoie toujours à la tâche d'origine, donc vous ne pouvez pas mettre à jour les attributs de l'occurrence . J'ai fini par utiliser ActiveJob et j'utilisais les informations de planification du cube de glace uniquement pour la planification conditionnelle de la duplication des tâches. –