2017-10-14 1 views
0

Ich habe versucht, eine benutzerdefinierte Aufgabenanwendung mit der Möglichkeit zu erstellen, wiederkehrende Aufgaben hinzuzufügen.Behandeln wiederkehrender Aufgaben in Rails

Mein erster Ansatz war die Verwendung von recurring_select auf der Vorderseite und ice_cube Logik auf der Rückseite. Es ist mir gelungen, einen Zeitplan mit allen gewünschten Vorkommen zu erzeugen, aber das Problem, das mir begegnet ist, ist, dass ich eine wiederkehrende Aufgabe nicht mehr als abgeschlossen markieren kann, da nur ihr Vorkommen angezeigt wird.

Hier ist ein Teil des Codes:

*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 

ich mich gefragt, ob es vielleicht eine bessere Art und Weise zu nähern, als die Edelsteine ​​mit? Ich habe gerade über das Planen von Rake-Aufgaben gelesen, aber ich habe es nie selbst gemacht, also bin ich mir nicht sicher, ob das auch der richtige Weg ist.

Vielen Dank im Voraus.

Antwort

1

Ja, es gibt eine bessere Möglichkeit, wiederkehrende Aufgaben mit Rake-Aufgaben und whenever gem zu erledigen. Es hat eine extrem einfach zu bedienende DSL

Alles, was Sie tun müssen, ist Ihre Rake-Aufgabe zu definieren und dann die Zeitplan-Konfiguration in eine Schedule.rb.

Allerdings, wenn Cron-Jobs verwendet und nicht von Heroku unterstützt wird. Wenn Sie Heroku verwenden, sollten Sie Heroku Scheduler verwenden. Alles, was Sie tun müssen, ist Ihre Aufgaben in einer Aufgaben/Scheduler.Rake zu definieren, installieren Sie das Addon und lassen Sie Heroku Scheduler den Rest erledigen.

Diese Ansätze helfen Ihnen, Ihre Modelle sauberer zu halten und die Planungsinformationen von ihnen zu entfernen. Im zweiten Teil Ihrer Frage, der wiederkehrende Aufgaben als erledigt markiert, müssen Sie lediglich ein boolesches Attribut say completed auf "true" setzen, wenn die wiederkehrende Aufgabe als abgeschlossen markiert ist, und dann eine Wächterklausel in Ihren Rake einfügen Aufgaben wie return if task.completed?, um die Verarbeitung für diese Aufgabe zu überspringen.

+0

Danke @Nwocha. Bezüglich des zweiten Teils meiner Frage ergab sich das Problem daraus, dass der Eiswürfel-Zeitplan nur ein Element im Speicher anzeigt, nicht in Ihrer Datenbank, sondern immer mit der ursprünglichen Aufgabe verknüpft ist. Daher können Sie die Attribute des Vorkommens nicht aktualisieren . Ich endete mit ActiveJob und die Eiscube Zeitplan Informationen nur für die bedingte Planung Task-Duplizierung verwenden. –

Verwandte Themen