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

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

单个条目可能是这样的:

  • 星期几:周三
  • 起始时间:10:00 AM
  • 结束时间:中午

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

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

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

关于每节课的开始时间和结束时间,你会使用日期时间字段还是整数字段?如果是后者,您将如何具体实施?

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

有帮助吗?

解决方案

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

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

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

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

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

其他提示

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

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

如果 t 是时间那么

t.strftime('%A')

总是会以英语字符串形式给出日期。然后可以根据需要由 i18n 进行翻译。

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

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

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

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

按天分组是 一点 更棘手。然而 这是一篇很棒的帖子 关于如何按周分组。按天分组也是类似的。

如果您正在处理大量数据,那么最好在数据库中进行处理,并使用 find_by_sql 这可能取决于数据库的时间和日期功能,但再次将数据存储为时间也会对您有所帮助。例如,在 Postgresql(我使用的)中,获取课程的周数是

date_trunc('week', starting_time)

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

一周中的几天,如果您需要例如在 MWF 上于 09:00-10:00 见面的班级,那么您可以使用单独的表格来记录班级见面的日期(由班级 ID 和 DOW 键入)或作恶(即,邪恶)。非标准化)并在每个类中保留 DOW 数组的等效值。经典的论点是这样的:

  • 单独的表可以以支持面向类或面向 DOW 的选择的方式进行索引,但需要更多的粘合才能将整个图片放在一起以形成一个类。
  • DOW 数组对于初学者来说更容易可视化,并且编码也稍微简单一些,但这意味着关于 DOW 的推理需要查看 全部 类。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top