在 Rails 中处理重复性任务
Handling recurring tasks in 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
我想知道是否有比使用宝石更好的方法来处理它?我正在阅读有关安排 rake 任务的信息,但我自己从未做过,所以我不确定这是否是可行的方法。
提前致谢。
是的,有一种更好的方法可以使用 rake 任务和 whenever gem 来执行重复性任务。它有一个非常容易使用的 DSL
您需要做的就是定义您的 rake 任务,然后将计划配置放在 schedule.rb 中。
但是,whenever 使用 cron 作业并且不受 Heroku 支持。如果您使用的是 Heroku,那么您应该使用 Heroku Scheduler。您需要做的就是在 tasks/scheduler.rake 中定义您的任务,安装插件并让 Heroku Scheduler 完成剩下的工作。
这种方法将有助于使您的模型更简洁并从中删除调度信息。
对于将重复性任务标记为完成的问题的第二部分,您需要做的就是在重复性任务标记为完成时将布尔属性设置为 completed
为真,然后添加一个rake 任务中的保护子句,例如 return if task.completed?
以跳过该任务的处理。
我一直在尝试构建一个定制的待办事项应用程序,可以添加重复性任务。
我的第一个方法是在前面使用 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
我想知道是否有比使用宝石更好的方法来处理它?我正在阅读有关安排 rake 任务的信息,但我自己从未做过,所以我不确定这是否是可行的方法。
提前致谢。
是的,有一种更好的方法可以使用 rake 任务和 whenever gem 来执行重复性任务。它有一个非常容易使用的 DSL
您需要做的就是定义您的 rake 任务,然后将计划配置放在 schedule.rb 中。
但是,whenever 使用 cron 作业并且不受 Heroku 支持。如果您使用的是 Heroku,那么您应该使用 Heroku Scheduler。您需要做的就是在 tasks/scheduler.rake 中定义您的任务,安装插件并让 Heroku Scheduler 完成剩下的工作。
这种方法将有助于使您的模型更简洁并从中删除调度信息。
对于将重复性任务标记为完成的问题的第二部分,您需要做的就是在重复性任务标记为完成时将布尔属性设置为 completed
为真,然后添加一个rake 任务中的保护子句,例如 return if task.completed?
以跳过该任务的处理。