日历中的重复事件 - Rails

2023-12-21

我正在寻找对重复事件进行建模的最佳方法。我正在使用 fullcalendar 来显示事件。但我认为重复事件最好在 Rails 后端处理。

我已经查看了其他问题和现有示例代码,但没有找到任何合适的内容。

它的行为应该类似于谷歌日历。所以应该可以删除/修改单个事件重复事件系列的一部分。但是将事件系列的所有事件保存在数据库中似乎效率很低。此外,应该可以创建单个事件而不重复发生。

什么是好的模型架构?

我的事件模型现在看起来像这样(没有附加属性):

# Table name: events
#
#  id              :integer         not null, primary key
#  employee_id     :integer
#  created_at      :datetime
#  updated_at      :datetime
#  starts_at       :datetime
#  ends_at         :datetime
#

class Event < ActiveRecord::Base
  attr_accessible :starts_at, :ends_at
end

这是我对此进行建模的方法。我不太用过 Google 日历,所以我的功能基于iCal http://support.apple.com/kb/HT2513的重复发生的事件。

所有模型都应具有常用的 id、created_at、updated_at 属性。列出的是自定义属性。如果该属性是另一个模型,您将实现它的关联,例如has_one or belongs_to.

  • RecurrencePeriod
    • Event基本事件# has_one :base_event, :class_name'Event'
    • Time结束日期# 如果永远重复的话可能为零
    • WeeklyRecurrence复发# has_one :recurrence, :as=>:recurrence
    • Array[OccurrenceOverride]覆盖# has_many :overrides, :class_name=>'OccurrenceOverride'

The RecurrencePeriod从其 base_event 开始的日期开始。另外,我假设Event的employee_id 指的是创建该事件的员工。 ARecurrencePeriod也将属于创建该 base_event 的员工。

该模型取决于您希望指定重复的灵活性。您打算支持“每两周周二和周四上午 10 点到上午 11 点以及下午 2 点到下午 3 点”还是只是“每周重复”?这是一个仅支持“每周重复”、“每两周重复”等的模型;如果需要,您可以扩展它。

  • WeeklyRecurrence
    • Integer重复次数之间的周数
    • RecurrencePeriod复发期# belongs_to :recurrence, :polymorphic=>true

I use 多态关联 http://guides.rubyonrails.org/association_basics.html#polymorphic-associations在这里,因为我认为如果您想要不止一种类型的重复,它们可能会很有用,例如WeeklyRecurrence and DailyRecurrence。但我不确定它们是建模的正确方法,所以如果结果不是,只需使用has_one :weekly_recurrence and belongs_to :recurrence_period反而。

The Ice cube http://seejohnrun.github.com/ice_cube/库似乎对于计算重复率可能有用。如果WeeklyRecurrence上面的功能不够强大,您可能只想存储一个冰块Schedule模型中的对象,替换WeeklyRecurrence。存储一个Schedule模型中的对象,将其保存为属性“schedule”,放入serialize :schedule在模型定义中,并在数据库中生成文本列“schedule”。

OccurrenceOverride处理正在编辑的重复事件的单个实例的情况。

  • OccurrenceOverride
    • RecurrencePeriod覆盖周期# belongs_to :recurrence_period_to_override, :class_name=>'RecurrencePeriod'
    • Time原始开始时间# 唯一标识要替换的 RecurrencePeriod 内的哪个重复
    • Event替换事件# has_one :replacement_event, :class_name=>'Event';如果该重复被删除而不是编辑,则可能为零

当您需要在视图中显示事件时,可以临时生成事件,而不是单独存储事件的每次发生。在RecurrencePeriod,创建一个方法generate_events_in_range(start_date, end_date)产生Events,不保存在数据库中,而只是传递给视图以便它可以显示它们。

当用户编辑重复事件时,他们应该可以选择修改所有发生的事件、所有未来发生的事件或仅修改该事件。如果他们修改了所有出现的情况,则修改RecurrencePeriod的基本事件。如果它们修改了所有未来的事件,请使用您应该实现的方法RecurrencePeriod它把自己一分为二RecurrencePeriods 位于某个日期的两侧,然后将更改保存到第二个期间。如果他们只修改该事件,则创建一个OccurrenceOverride当它们被覆盖时,并将更改保存到覆盖的 replacement_event 中。

当用户说某个事件现在应该在可预见的未来每两周重复一次时,您应该创建一个新的RecurrencePeriod该事件作为 base_event 和 nil end_date。它的复发应该是一个新的WeeklyRecurrenceWeeks_ Between_recurrence = 2,并且它应该没有OccurrenceOverrides.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

日历中的重复事件 - Rails 的相关文章

随机推荐

  • awk 搜索另一个文件中的字段

    我需要在第二个文件中搜索一个文件中的字段 想知道 awk 是否是正确的解决方案 file 1 one two file 2 something one balh one blah two blah two 所需输出 one somethin
  • 为什么在检查最近的提交后我有一个分离的 HEAD?

    最近 在使用 git 存储库时 我想查看旧提交中的代码 68cce45 所以我做了 git checkout 68cce45 查看更改后 我想返回到存储库的当前版本并继续工作 自从2bcfd11是最近的提交 我做了 git checkout
  • 如何将自动布局与容器转换结合使用?

    如何将自动布局与 UIViewController 容器转换方法一起使用 void transitionFromViewController UIViewController fromViewController toViewControl
  • 将一个数据系列绘制在另一个数据系列下方

    当您在 Matlab 中绘制图形时 最近绘制的数据系列会放置在已有数据之上 例如 figure hold on plot sin linspace 0 pi linewidth 4 color 0 0 1 plot cos linspace
  • Android Firebase 应用程序分发 - 服务凭证文件不存在。请检查服务凭证路径并重试

    我正在尝试从 Crashlytics Beta 迁移到 Firebase App Distribution 中间的 CircleCi CircleCi 中的构建失败并出现以下错误 什么地方出了错 任务 FiverrApp appDistri
  • Odoo 销售点 + 邮箱:如何修改收据

    我需要修改销售点收据 在 Odoo 销售点中 有两个打印收据的模板 XmlReceipt 和 PostTicket 当我使用 Posbox 时 我想我必须修改 XmlReceipt 请问有没有办法继承原来的模板 我找到了有关如何使用 Pos
  • 没有错误:无法在谷歌云存储上查看上传的文件

    使用云函数在云函数上运行 python 代码云函数 python https github com MartinSahlen cloud functions python 我正在云上处理图像 现在我想将该图像保存在google cloud
  • 使用 TStringList 的奇怪 EOutOfMemory 异常

    我有一个系统 它加载一些压缩到 log 文件中的文本文件 然后使用多个线程解析为信息类 每个线程处理不同的文件并将解析的对象添加到列表中 该文件是使用 TStringList 加载的 因为它是我测试过的最快的方法 文本文件的数量是可变的 但
  • 在 Python 中迭代模块

    所以我有一个嵌套文件夹 其中有执行某些操作的模块 注意 它们不是类 只是脚本 我想迭代这些模块 我现在拥有的 from scripts module 1 import train module 1 from scripts module 2
  • CouchDB Views - 列出函数性能影响?

    你们中的许多人都知道 couchdb 视图的响应如下 rows key 1 value Col1 Some Value key 2 value Col1 Another Value 好吧 我想将其整理为 key 1 value Col1 S
  • 如何更改作为参数传递给函数的变量?

    我试图通过使用返回 void 的函数来更改结构内的一些变量 该函数采用 Struct 成员作为参数 结构数组和大小 该函数有一些代码 最终会更改结构成员内的一些变量 但是 我知道当您将某些内容作为参数传递给函数时 您正在使用副本而不是原始文
  • 在 PHP 中通过 SSH 连接到 MySQL 服务器

    我想通过 ssh 建立一个到我的 mysql 服务器的 ssh 隧道 理想情况下 我会返回一个 mysqli db 指针 就像我直接连接一样 我所在的共享主机没有SSH2 http ca php net ssh2库 但我也许可以使用 PEC
  • 我能知道 BufferedImage 最初的文件类型是什么吗?

    在我的代码中 我有一个缓冲图像 http docs oracle com javase 7 docs api java awt image BufferedImage html那是装载有ImageIO http docs oracle co
  • qtextedit - 调整大小以适合

    我有一个QText编辑 https doc qt io qt 5 QTextEdit html充当 显示者 可编辑为 false 它显示的文本是自动换行的 现在我确实希望设置此文本框的高度 以便文本完全适合 同时也遵守最大高度 基本上 布局
  • docker-compose - 我可以在不重新启动容器的情况下更新 traefik 标签吗?

    我可以使用 docker compose 更新容器上的标签而不重新启动容器吗 理想场景 更改 docker compose yml 中的标签 保存 docker compose yml 运行命令来更新标签 无需重新启动容器 一般来说 更改容
  • Numpy:如何按列堆叠数组?

    假设我有 n 个相同长度的 numpy 数组 我现在想创建一个 numpy 矩阵 使得矩阵的每一列都是 numpy 数组之一 我怎样才能实现这个目标 现在我正在循环中执行此操作 但会产生错误的结果 注意 我必须能够迭代地将它们一一堆叠在一起
  • 从 void ** 到 char ** 的转换有多危险

    所以我们知道标准并不强制指针大小相等 here https stackoverflow com questions 1241205 are all data pointers of the same size in one platform
  • jQuery:如何获取表单提交时单击了哪个按钮?

    我有一个 submit 为表单提交设置的事件 我的页面上还有多个表单 但本示例仅提供一个表单 我想知道在没有应用的情况下单击了哪个提交按钮 click 事件对每个人来说 这是设置
  • HTTP 请求标头

    好的 我一直在使用原始 HTTP 请求 发现我可以将原始 HTTP 响应发布到 NSLog 中 并且我几乎已经将原始 HTTP 请求破解到 NSLog 中 我现在有点卡住了 代码示例 NSString CurrentWebURL webVi
  • 日历中的重复事件 - Rails

    我正在寻找对重复事件进行建模的最佳方法 我正在使用 fullcalendar 来显示事件 但我认为重复事件最好在 Rails 后端处理 我已经查看了其他问题和现有示例代码 但没有找到任何合适的内容 它的行为应该类似于谷歌日历 所以应该可以删