私は定期的なタスクを追加するためのカスタマイズされた予定アプリを構築しようとしていました。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
の宝石を使用するよりも、それにアプローチするより良い方法は多分あります場合、私は不思議でしたか?私はレイクタスクのスケジューリングについて読んでいましたが、自分でそれをやったことはありませんでした。
ありがとうございます。
ありがとう@Nwocha。私の質問の第二の部分に関しては、アイスキューブのスケジュールはメモリに存在する要素だけを表示し、元のタスクに常にリンクするため、オカレンスの属性を更新することはできません。 ActiveJobを使用し、アイスキューブスケジュール情報を使用して、タスクの重複を条件付きでスケジュールすることができました。 –