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

时间:2009-01-09 11:01:17

标签: ruby-on-rails ruby activerecord schedule

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

  • 星期几
  • 开始时间
  • 结束时间

单个条目可以是:

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

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

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

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

关于每个课程的开始时间和结束时间,您会使用日期时间字段还是整数字段?如果是后者你会如何实现这个呢?

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

3 个答案:

答案 0 :(得分:3)

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

这会让分组变得非常简单。您所要做的就是按星期几和开始时间排序。

你可以用多种方式显示它,但这就是我要做的。

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

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

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

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

  3. 翻译是唯一棘手的部分。您可以创建一个带整数的辅助函数,并根据本地返回一周中相应日期的文本。
  4. 这是非常基本的。没什么复杂的。

答案 1 :(得分:2)

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

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

如果是时间,那么

t.strftime('%A')

总会以英文字符串为您提供日期。然后可以根据需要通过i18n进行翻译。

所以你只需要存储开始时间和结束时间,或者开始时间和持续时间。两者都应该是等价的。如果您需要对结束时间进行数据处理,我将很想存储结束时间,因此无需计算。

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

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

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

按日分组有点更棘手。但是this is an excellent post关于如何按周分组。白天分组将是类似的。

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

date_trunc('week', starting_time)

可以在Group By子句中使用,也可以在rails中的某些循环逻辑中使用。

答案 2 :(得分:1)

每周重复,如果您需要例如在MWF上遇到09:00-10:00的课程,那么你可以在一个班级遇到的日子里使用一个单独的表(由班级ID和DOW键入)或者是邪恶的(即非标准化的)并保持相当于每个班级的DOW数组。经典的论点是:

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

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

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

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

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