【问题标题】:How would you build this daily class schedule?你将如何制定这个每日课程表?
【发布时间】:2009-01-09 11:01:17
【问题描述】:

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

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

单个条目可能是这样的:

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

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

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

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

关于每个班级的开始时间和结束时间,你会使用日期时间字段还是整数字段?如果是后者,您将如何准确实现?

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

【问题讨论】:

    标签: ruby-on-rails ruby activerecord schedule


    【解决方案1】:

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

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

    您可以通过多种方式显示它,但我会这样做。

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

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

    【讨论】:

      【解决方案2】:

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

      这应该意味着您不需要存储日期列表。

      如果 t 是一个时间,那么

      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 中的某些循环逻辑中使用。

      【讨论】:

        【解决方案3】:

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

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

        如果这只是为了您的个人课程安排,那就去做能够让您获得所需价值的事情,并承担后果;如果您尝试为多个用户构建一个真实的系统,我会使用单独的表。所有这些规范化规则的存在都是有原因的。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-11
          • 1970-01-01
          • 1970-01-01
          • 2020-06-07
          • 2011-03-09
          • 2018-04-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多