我正在尝试在 RoR 中创建一个简单的道场考勤应用程序,目前在我知道我能做什么和我想做的事情之间陷入困境,至少在显示、创建和更新考勤记录方面. (应用程序的其余部分对我来说似乎很简单。)
这是相关表的架构:
create_table "attendances", :force => true do |t|
t.date "class_date"
t.integer "student_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "class_hours", :default => 0
end
我知道我可以为此利用基本的脚手架视图,但这样做会很乏味,即新的出勤记录,选择日期,学生和花费的时间,保存,返回索引视图(修改为仅限于特定月份) . 单条记录的创建需要多次点击。本身并不可怕,但我可以看到每个新条目都会变得乏味。也就是说,如果系统用户意识到为该学生输入了错误的小时数,那么这种方法的更新将非常简单。如果需要,完全删除记录非常简单。
我可以看到自己增强了上述内容:
- 索引视图列出了给定月份的所有学生,无论他们是否上课
- 可能使学生的姓名成为新出勤页面的链接(如上所述)
- 如果学生在该日期有该月的条目,则网格中的该单元格将是指向该记录的“编辑出勤”页面的链接
- 我想我可以在编辑出勤页面的底部添加一个删除链接
我真正想要的是提供以下内容的视图:
- 月份一览网格(视图顶部的月份名称,最好使用 jQuery 的日期选择器)
- 网格的第一列列出了所有学生
- 每列的标题(在第一列之后)一个月的天数,从 1 到 N(一个月的最后一天)
- 如果学生在特定日期存在出勤记录,则在单元格中显示小时数
- 如果学生在特定日期不存在出勤记录,则不显示任何内容(或显示“-”或类似的占位符)
我转来转去试图弄清楚这一点。如果网格对每个单元格都有值(即,每个学生都有一个显示该月每一天的记录),那么我可以使用best_in_place来解决这个问题。做完了。但是以这种方式使表格膨胀似乎是对表格的非常低效的使用,尤其是当您考虑到 a) 学生可能会永远留在名册上,除非他们做了如此令人震惊的事情以至于被禁止从道场,b) 没有人参加所有可用的课程,c) 很少有学生参加大多数可用的课程。我考虑尝试让它与 best_in_class_if 一起使用,但它仍然需要记录存在才能显示它。啊。
我最近才知道 find_or_create_by ,它短暂地给了我希望,作为克服这个问题的一种方式。然后,我了解到了这种创建create_or_update_by的方法,这给了我另一种希望,作为克服这个问题的一种方式,但仍然有一些问题困扰着我,如何接近它来实现它。即,我必须在网格(html 表)中创建某种对不存在的记录的引用,这似乎无法实现。(我在从 rails 控制台测试 create_or_update_by 时也遇到了问题,LocalJumpError: no block given (yield)
但我无法确定原因。)
如果我不清楚我试图通过每月一目了然的出勤视图获得的外观和感觉,请将其视为 Excel 电子表格:学生在左列下方,天数-顶部的月份,如果单元格为空,则可以向其中添加值,如果单元格有值,则可以更改。(蓝天:如果class_hours值设置为零,则删除记录。)
我试图在 Routes 文档和 Controllers 文档中找到灵感。没有喜悦。
只要考虑以下几点,我很乐意考虑替代 RoR 解决方案,因为我意识到我可能完全错过了一种更明显/优雅的方法:
- 出勤月一览视图(使用我已经成功利用的DataTables)列出了系统中的所有学生,无论他们当月是否上课
- 添加/更新学生出勤率的简单方法,理想情况下,点击次数少于基本脚手架视图
干杯。
编辑:进一步考虑,似乎一种合理的方法是使数据网格中尚未在出勤表中具有表示的单元格成为一个链接,该链接将参数 student_id、class_date 和 class_hours 传递给 /出席/新路线(从脚手架修改以接受和使用参数),同样用于单击已经具有值的单元格。(我仍然可以考虑为后者使用 best_in_place,但为了用户界面的一致性,也许我应该避免这种情况。)
如果我错过了以更好的方式解决这个问题的黄金机会,我仍然很乐意接受有见地的建议。