0

我正在 Ruby on Rails 中构建一个电视连续剧调度应用程序,它根据当前电视上的内容执行某些操作。用户可以创建具有开始和结束日期的系列,并可以为这些系列创建广播。广播可以在三个频道之一上进行,形式为“每周二,频道 2,从 10:00:00 到 14:00:00”。

目前,我用以下列将这些广播存储在 MySQL 中:wday整数、starts_at时间ends_at字段和channel_id整数。因此,上述广播将存储wday2、2 channel_idstarts_at“10:00:00”和ends_at“14:00:00”,以及对其所属事件的引用。广播可以“跨越”午夜,因此应用程序应允许以“23:00:00”开始和“02:00:00”结束的广播,即第二天凌晨 2 点。

我在以下两个问题上遇到了一些严重的问题:

  • 在特定频道的特定时间只能安排一次广播。该应用程序需要验证用户输入,并检查是否存在针对特定频道和时间的广播。

  • 该应用程序需要为三个频道中的每一个显示当前显示的广播(如果有)。基本上,对于每个频道,找到一个开始时间 < 当前时间 < 结束时间的广播。显然,这也需要与跨越午夜的广播一起工作。

我完全不确定使用时间字段作为开始/结束时间是否是最佳解决方案。请记住,我需要存储时间值,而不是日期,因为在该系列的持续时间内,每周二都会进行广播。

您将如何存储这些广播,允许验证并允许在特定时间进行查询,允许广播“跨越”午夜?

4

3 回答 3

0

一旦完成所有检查和计算(应该在某处开箱即用),如何使用 Unix / epoch 时间戳,并创建一些业务逻辑将其转换为漂亮的日期?这样看来你会避免很多午夜和其他与日期相关的问题......

于 2013-05-31T11:02:08.323 回答
0

很公平 - 然后您应该将开始/结束时间存储为星期一(或任何时候)午夜后的秒数。然后,您可以使用访问器/设置器将数据转换为人类可解析的格式。查找当前显示的程序变得如此简单:

time_now = 18494
Program.where 'start_time >= ? AND end_time < ?', time_now, time_now

验证同样简单。

于 2013-05-31T10:33:58.797 回答
0

这类问题是边缘情况的雷区,我总是将逻辑委托给 IceCube(https://github.com/seejohnrun/ice_cube)之类的东西。它是为处理这些重复的计划而设计的,并带有对序列化等的简单支持。即使它需要重新考虑你如何做事,我强烈建议使用它。

于 2013-05-31T08:54:33.507 回答