2017-10-14 13 views
0

私は定期的なタスクを追加するためのカスタマイズされた予定アプリを構築しようとしていました。Railsで繰り返しタスクを処理する

私の最初のアプローチは、背面のフロントとice_cubeロジックでrecurring_selectを使用することでした。私はすべての希望の出現を含むスケジュールを生成することができましたが、私が遭遇した問題は、これが表示されているオカレンスだけであるため、この方法では、

ここでは、コードの一部です:

*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 

の宝石を使用するよりも、それにアプローチするより良い方法は多分あります場合、私は不思議でしたか?私はレイクタスクのスケジューリングについて読んでいましたが、自分でそれをやったことはありませんでした。

ありがとうございます。

答えて

1

はい、レーキタスクとwhenever gemを使用して繰り返しタスクを実行するより良い方法があります。それは非常に使いやすいDSLを持っています

あなたのレーキタスクを定義し、スケジュールの設定をschedule.rbの中に入れるだけです。

ただし、cronジョブを使用する場合はいつでも、Herokuではサポートされていません。 Herokuを使用している場合は、Heroku Schedulerを使用してください。 tasks/scheduler.rakeでタスクを定義するだけで、アドオンをインストールして、Heroku Schedulerに残りをさせるだけです。

このアプローチは、モデルをよりきれいに保ち、スケジュール情報を削除するのに役立ちます。

定期的なタスクを完了としてマークする2番目の部分には、定期的なタスクが完了とマークされた後、レーキにガード句を追加するとブール値アトリビュートcompletedがtrueに設定されますそのタスクの処理をスキップするにはreturn if task.completed?のようなタスクを使用します。

+0

ありがとう@Nwocha。私の質問の第二の部分に関しては、アイスキューブのスケジュールはメモリに存在する要素だけを表示し、元のタスクに常にリンクするため、オカレンスの属性を更新することはできません。 ActiveJobを使用し、アイスキューブスケジュール情報を使用して、タスクの重複を条件付きでスケジュールすることができました。 –

関連する問題