Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中处理重复任务_Ruby On Rails_Ruby_Recurring Events_Ice Cube - Fatal编程技术网

Ruby on rails 在Rails中处理重复任务

Ruby on rails 在Rails中处理重复任务,ruby-on-rails,ruby,recurring-events,ice-cube,Ruby On Rails,Ruby,Recurring Events,Ice Cube,我一直在尝试构建一个定制的待办应用程序,可以添加重复性任务 我的第一种方法是在前面使用循环选择,在后面使用冰块逻辑。我成功地生成了一个包含所有期望事件的计划,但我遇到的问题是,这样我就不能再将周期性任务标记为已完成,因为只显示它的事件 下面是一些代码: *task.rb* class Task < ApplicationRecord (...) serialize :recurrence, Hash def recurrence=(value) # byebug

我一直在尝试构建一个定制的待办应用程序,可以添加重复性任务

我的第一种方法是在前面使用循环选择,在后面使用冰块逻辑。我成功地生成了一个包含所有期望事件的计划,但我遇到的问题是,这样我就不能再将周期性任务标记为已完成,因为只显示它的事件

下面是一些代码:

*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
*task.rb*
类任务<应用程序记录
(...)
序列化:递归、哈希
def递归=(值)
#比伯
如果值!=“null”&&RecurringSelect。规则有效吗?(值)
超级(RecurringSelect.dirty\u散列\u到\u规则(值)。到\u散列)
其他的
超级(零)
结束
结束
def规则
IceCube::Rule.from\u哈希重复
结束
def时间表(开始)
schedule=IceCube::schedule.new(开始)
计划。添加定期规则(规则)
日程
结束
def显示任务(启动)
如果是空的?
[自我]
其他的
开始日期=开始周的开始日期
结束日期=开始。结束一周
计划(开始日期)。事件(结束日期)。地图执行日期|
新任务(id:id,名称:名称,开始时间:日期)
结束
结束
结束
结束
*任务\u controller.rb*
类TasksController
我想知道是否有比使用宝石更好的方法?我读过关于安排rake任务的书,但我自己从来没有做过,所以我也不确定这是不是可行的方法


提前感谢。

是的,有一种更好的方法可以使用rake任务和。它有一个非常容易使用的DSL

您只需定义rake任务,然后将调度配置放入schedule.rb中

但是,只要使用cron作业,Heroku就不支持它。如果您正在使用Heroku,那么您应该使用。你所需要做的就是在一个任务/调度程序中定义你的任务。rake,安装插件,让Heroku调度程序完成其余的工作

这种方法将有助于保持模型更干净,并从模型中删除调度信息


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

是,有一种更好的方法可以使用rake任务和。它有一个非常容易使用的DSL

您只需定义rake任务,然后将调度配置放入schedule.rb中

但是,只要使用cron作业,Heroku就不支持它。如果您正在使用Heroku,那么您应该使用。你所需要做的就是在一个任务/调度程序中定义你的任务。rake,安装插件,让Heroku调度程序完成其余的工作

这种方法将有助于保持模型更干净,并从模型中删除调度信息


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

谢谢@Nwocha。关于我问题的第二部分,尽管问题是由以下事实引起的:ice cube schedule仅显示内存中的元素,而不是数据库中的元素,但将始终链接回原始任务,因此无法更新事件的属性。最后,我使用ActiveJob并使用ice cube计划信息仅用于有条件地计划任务复制。谢谢@Nwocha。关于我问题的第二部分,尽管问题是由以下事实引起的:ice cube schedule仅显示内存中的元素,而不是数据库中的元素,但将始终链接回原始任务,因此无法更新事件的属性。最后,我使用ActiveJob并使用ice cube计划信息仅用于有条件地计划任务复制。