我正在构建一个包含Workflows
和Tasks
的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_date
为01/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
的问题。
答案 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,您不必担心复杂的更新逻辑。也许我错过了上面的东西..