处理Rails中的重复任务

时间:2017-10-14 15:52:57

标签: ruby-on-rails ruby recurring-events ice-cube

我一直在努力构建一个定制的待办事项应用程序,可以添加重复性任务。

我的第一种方法是在前面使用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任务的内容,但我自己从未这样做过,所以我不确定这是不是这样。

提前致谢。

1 个答案:

答案 0 :(得分:1)

是的,有一种更好的方法可以使用rake任务和whenever gem来执行重复任务。它有一个非常容易使用的DSL

您需要做的就是定义您的rake任务,然后将计划配置放在schedule.rb中。

但是,每当使用cron作业时,Heroku都不支持。如果您使用的是Heroku,那么您应该使用Heroku Scheduler。您需要做的就是在 tasks / scheduler.rake 中定义您的任务,安装插件并让Heroku Scheduler完成其余工作。

此方法有助于保持模型更清晰,并从中删除计划信息。

对于将重复任务标记为完成的问题的第二部分,您需要做的就是将定期任务标记为完成时将布尔属性说completed设置为true,然后添加一个保护子句在你的rake任务中,例如return if task.completed?,以跳过该任务的处理。