4

我想做的很简单,但我正在努力寻找最好或最优雅的方式来做到这一点。我现在正在构建的 Rails 应用程序将有一个每日课程的时间表。对于每个班级,与此问题相关的字段是:

  • 一周中的天
  • 起始时间
  • 结束时间

单个条目可能是这样的:

  • 星期几:星期三
  • 开始时间:上午10:00
  • 结束时间:中午

另外我必须提到它是一个双语 Rails 2.2 应用程序,我使用的是原生 i18n Rails 功能。我其实有几个问题。

关于一周中的哪一天,我应该创建一个包含天数列表的额外表格,还是有内置方法可以即时创建该列表?请记住,根据语言环境变量,一周中的这些日子必须在日程表视图中以英语或西班牙语呈现。

在查询时间表时,我需要按工作日(从周一到周日)对结果进行分组和排序,当然还需要按开始时间对每天的课程进行排序。

关于每节课的开始时间和结束时间,您会使用日期时间字段还是整数字段?如果是后者,您将如何准确地实现这一点?

期待阅读你们提出的不同建议。

4

3 回答 3

4

我只是将星期几存储为整数。0 => 星期一 ... 6 => 星期日(或任何您想要的方式。即 0 => 星期日)。然后将开始时间和结束时间存储为时间。

这将使分组变得非常容易。您所要做的就是按星期几和开始时间排序。

您可以通过多种方式显示它,但这就是我要做的。

  1. 具有以下功能:@sunday_classes = DailyClass.find_sunday_classes返回按开始时间排序的星期日的所有类。然后每天重复。

    def find_sunday_classes
      find_by_day_of_week(1, :order -> 'start_time')
    结尾

    注意: find_by 最后可能应该有 id ,但这只是您希望如何命名列的偏好。

  2. 如果你想要一整周,那么从控制器调用所有七个并在视图中循环遍历它们。您甚至可以为每一天创建详细信息页面。

  3. 翻译是唯一棘手的部分。您可以创建一个辅助函数,该函数接受一个整数并根据本地返回一周中适当日期的文本。

这是非常基本的。没什么复杂的。

于 2009-01-09T21:23:47.937 回答
2

如果您的数据是时间,那么我会将其存储为时间 - 否则当您对其进行与日期和时间相关的操作时,您将始终必须将其从数据库中转换出来。日期是冗余数据,因为它将是时间对象的一部分。

这应该意味着您不需要存储天数列表。

如果 t 是一个时间,那么

t.strftime('%A')

总是会给你一天的英文字符串。然后可以根据需要由 i18n 翻译。

所以你只需要存储开始时间和结束时间,或者开始时间和持续时间。两者应该是等价的。我很想自己存储结束时间,以防您需要对结束时间进行数据操作,因此不必计算。

我认为您所描述的其余大部分内容也应该不将时间数据存储为时间实例。

按工作日和时间排序只是按您的时间列排序的问题。IE

daily_class.find(:all, :conditions => ['whatever'], :order => :starting_time)

按天分组有点棘手。然而,这是一篇关于如何按周分组的优秀帖子。按天分组将是类似的。

如果您要处理大量数据,最好在数据库中进行处理,使用find_by_sqland 可能取决于数据库的时间和日期功能,但再次将数据存储为 Time 也将对您有所帮助. 例如在 Postgresql(我使用的)中,获取课程的星期是

date_trunc('week', starting_time)

您可以在 Group By 子句中使用它,或者作为在 rails 中的某些循环逻辑中使用的值。

于 2009-01-09T11:53:53.487 回答
1

关于星期几,如果您需要例如在 MWF 上满足 09:00-10:00 的课程,那么您可以使用单独的表格来显示课程满足的天数(由课程 ID 和 DOW 键入)或者邪恶(即非规范化)并在每个类中保留相当于一个 DOW 数组。经典的论点是这样的:

  • 可以以某种方式对单独的表进行索引以支持面向类或面向 DOW 的选择,但需要更多的胶水将整个图片组合在一起以形成一个类。
  • 对于初学者来说,DOW 数组更易于可视化,代码也稍微简单一些,但这意味着关于 DOW 的推理需要查看所有类。

如果这仅适用于您的个人课程表,请做让您获得您正在寻找的价值的事情,并承担后果;如果您尝试为多个用户构建一个真实的系统,我会使用单独的表。所有这些规范化规则的存在都是有原因的。

至于(人类可读的)DOW 名称,这是一个表示层问题,不应该在 DOW 的核心概念中。(假设您决定搬到蒙特利尔,并且需要法语?那应该是另一个“面孔”,而不是对核心实现的更改。)

至于开始/结束时间,问题又是您的要求。如果所有课程都在小时 (x:00) 边界开始和结束,您当然可以使用 0..23 作为一天中的小时数。但是,一旦你不得不适应那个 45 分钟的研讨会,你的生活就会变得悲惨。正如旧广告所说,“现在付钱给我,或者以后付钱给我。”

一种方法是定义您自己的 ClassTime 概念并将所有关于时间的推理划分为该类。它可以从一个简单的表示开始(整数小时 0..23,或午夜 0..1439 之后的整数分钟),然后根据需要“增长”。

于 2009-01-09T13:03:27.713 回答