【发布时间】:2023-03-19 19:03:01
【问题描述】:
我有三个模型:
- 课程
- 用户
- 课程完成
除了标题和内容之类的东西,每门课程还有一个分值。当用户完成一门课程时,他们将获得该课程的积分值,该积分值将添加到他们的total_points。 CourseCompletion 只是跟踪哪个用户完成了哪些课程(带有user_id、course_id 和completion_date 列)。
此数据模型的一个弱点是,如果管理员用户在用户完成该课程之后编辑该课程的积分值,则该用户的积分不会更新。我需要一种方法来追溯地做到这一点。例如,如果用户完成一门课程并获得 10 分,然后管理员将课程更改为 20 分,则该用户最终应该有 20 分。我以前没有做过这种事情——最好的方法是什么?
我目前的计划是双重的。在第一部分中,我对 Course 和 CourseCompletion 模型进行了更改:
- 向 CourseCompletion 添加一个
points_earned列,以记录用户完成该课程所获得的积分。 - 将
points_recently_changed列添加到课程。如果课程的分数随时更新,请将此列设置为该课程的 true。 (see my related question)
在第二部分中,脚本或任务 (?) 每天运行一次并执行以下操作:
- 获取
points_recently_changed等于 true 的所有课程 - 查找这些课程的所有课程完成情况
- 计算 course.points 和 course_completion.points_earned 之间的差异
- 相应地更新相应用户的总积分
- 将 course.points_recently_updated 改回 false。
这种方法是否存在任何明显的问题,或者是否有“Rails 方式”来做这样的事情?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4