你会如何建立这个每日课程表?

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

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

单个条目可能是这样的:

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

此外,我必须提到它是一个双语Rails 2.2应用程序,我正在使用本机i18n Railsfunction。 我其实有几个问题。

关于一周中的哪一天,我应该创建一个包含日期列表的额外表格,还是有一种内置的方式来动态创建该列表? 请记住,一周中的这几天必须在日程表视图中以英语或西class牙语呈现,具体取决于区域设置变量。

在查询时间表时,我需要在星期一到星期日的工作日对结果进行分组和排序,当然也可以按照开始时间在每天内订购课程。

关于每个类的开始时间和结束时间,您会使用datetime字段还是整数字段? 如果是后者你将如何实现这一点?

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

我只是将星期几存储为整数。 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. 翻译是唯一棘手的部分。 您可以创建一个带整数的辅助函数,并根据本地返回一周中相应日期的文本。

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

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

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

如果t是时间

 t.strftime('%A') 

总会给你一天英文字符串。 然后可以根据需要通过i18n进行翻译。

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

我认为你所描述的大部分内容也应该不再存储时间数据作为时间的实例。

按工作日和时间排序只需按时间栏排序。 即

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

白天分组比较棘手。 然而, 这是一篇关于如何按周分组的优秀文章 。 白天分组将是类似的。

如果您正在处理非平凡的数据量,最好在数据库中使用find_by_sql ,这可能取决于您的数据库的时间和日期function,但再次将数据存储为时间也将帮助您这里。 例如在Postgresql(我使用的)中,获取课程周

 date_trunc('week', starting_time) 

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

如果您需要在MWF上遇到例如09:00-10:00的课程,那么您可以在课程遇到的日子里使用单独的表(由class级ID和DOW键入)或者是邪恶(即非规范化)并在每个类中保持等效的DOW数组。 经典的论点是这样的:

  • 单独的表可以以支持面向类或面向DOW的选择的方式编制索引,但需要更多的粘合剂以将整个图片放在一起用于类。
  • 对于初学程序员来说,DOW数组更容易可视化,而对于代码来说稍微简单一些,但这意味着有关DOW的推理需要查看所有类。

如果这只是为了您的个人课程安排,那么做什么可以让您获得所需的价值,并承担后果; 如果你想为多个用户构建一个真实的系统,我会选择一个单独的表。 所有这些规范化规则都是有原因的。

至于(人类可读的)DOW名称,这是一个表示层问题,而不应该是DOW的核心概念。 (假设你决定搬到蒙特利尔,需要法国人?这应该是另一个“面子”而不是对核心实施的改变。)

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

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