分配相对于另一个记录日期的日期

时间:2017-04-13 16:48:22

标签: ruby-on-rails notifications relative-date

我正在构建一个包含WorkflowsTasks的Rails 4.2+应用程序。 task.due_date可以是指定日期(例如" 01/01 / 2017"),也可以相对于父workflow条记录上的日期。

class Workflow < ApplicationRecord
  # closing_date:date

  after_save :update_relative_tasks

  has_many :tasks

  # Production code would make sure closing_date changed before updating associations
  def update_relative_tasks
    tasks.where(has_relative_date: true).each do |task|
      task.update_relative_due_date(closing_date)
    end
  end
end

class Task < ApplicationRecord
  # due_date:date
  # has_relative_date:boolean (default: false)
  # number:integer (default: 0)
  # days_or_weeks:string (default: "days")
  # before_or_after:string (default: "after")
  # workflow:references

  belongs_to :workflow

  def number_of_days
    @number_of_days ||= if days_or_weeks == "weeks"
      number * 7 # relative date is in "weeks"
    else
      number # assume relative date is in "days"
    end
  end

  # Pseudo-ish code, not tested, but shows concept
  def update_relative_due_date(date)
    new_due_date = if before_or_after == "before"
      date - number_of_days.days
    else
      date + number_of_days.days
    end

   update_attribute(:due_date, new_due_date)
  end
end

task上分配特定日期很简单,我只使用日历小部件并设置日期,没问题。

棘手的部分是根据task.due_date分配相对workflow.closing_date

例如,我们假设workflow.closing_date01/01/2017,我希望在该日期之前(或之后)的5天内完成任务。

我可以添加一些表单字段,其中括号表示输入字段:

Due Date: [x] number of [days|weeks] [before|after] workflow.closing_date

然后我可以在Ruby代码中解析它并使用正确的task更新due_date

但是,如果workflow.closing_date发生变化,那么我需要找到所有关联的tasks并重新计算其相对日期。此外,如果workflow.closing_date最初未知且稍后添加,则需要重新计算所有相关任务的截止日期。

最后,我还要向tasks添加提醒,这些提醒也将与task.due_date相关。与Google日历的通知工作非常相似。

这样的事情怎么解决了?我知道我需要添加后台处理器来处理发送提醒。但是我不确定如何解决在另一条记录上相对于某个日期设置task.due_date的问题。

1 个答案:

答案 0 :(得分:0)

我可能会错过这个问题的难度所以会试着通过它来解决。您是否可以在工作流上设置after_save过滤器,以便在保存工作流时处理对相关对象的任何更改?

<强> workflow.rb

after_save :update_due_date

def update_due_date
   self.tasks.update_all(due_date: self.closing_date + 5.days)
end

这样,关闭日期的任务总是相对于工作流的closing_date,您不必担心复杂的更新逻辑。也许我错过了上面的东西..

相关问题