mindpin / kc_courses

MIT License
0 stars 6 forks source link

课程学习进度 #13

Closed fushang318 closed 8 years ago

fushang318 commented 8 years ago

功能描述

用户学习一门课程,需要有一个学习进度的展示,包括:

  1. 某用户对一门课的整体学习进度(比如张三目前已经学习了 ruby编程 这门课的 50% 的内容)
  2. 某用户对一门课中的某一个章节的学习进度
  3. 某用户对一门课中某一个章节下的某一个小节的学习进度
  4. 某用户在某一天内学习的某一门课的进度(比如张三在 2015年5月1日 这一天内学习了 ruby编程 这门课的 5% 的内容)
  5. 某用户在某一天内学习的某一门课中的某一个章节的进度
  6. 某用户在某一天内学习的某一门课中的某一个章节下的某一个小节的进度

    建模

# 记录某一小节的学习进度
ware_reading
  user_id      # 学习进度的所有者
  course_id    # 所属课程
  chapter_id   # 所属章节
  ware_id      # 所属小节
  read_percent # Integer 类型,比如学习了 1/3 时,该值为 33 (表示 33%)
  created_at   # 创建时间
  updated_at   # 最后更新时间

# 记录某一天内某一小节的学习进度变化(一个用户针对同一个小节 ware,一天内只有一个 ware_reading_delta 记录)
ware_reading_delta
  user_id             # 学习进度的所有者
  course_id           # 所属课程
  chapter_id          # 所属章节
  ware_id             # 所属小节
  time                # Time 类型,表示这条记录代表的日期(某一天,要求用一天的第一秒代表的时间,比如 Time.now.beginning_of_day)
  read_percent_change # Integer 类型,比如当天内学习了 1/5,那么该值为 20(表示 20%)
  read_percent        # Integer 类型,比如当天开始前已经学习了 1/5,当天内又学习了 1/5,那么该值为 40(表示 40%)
  created_at          # 创建时间
  updated_at          # 最后更新时间

需要做的工作

测试驱动开发,完成如下方法的封装

# 设置 user 已经完成了 ware 百分之 read_percent 的内容
ware.set_read_percent_by_user(user, read_percent)

# user 是否已经完成整个 ware 的学习(read_percent 是 100 时,表示完成学习)
ware.has_read_by_user?(user)
# user 已经学习了 ware 多少百分比的内容,返回值是代表百分比的数字
ware.read_percent_of_user(user)

chapter.has_read_by_user?(user)
chapter.read_percent_of_user(user)
course.has_read_by_user?(user)
course.read_percent_of_user(user)

# user 某一天内学习了 ware 多少百分比的内容,返回值是代表百分比的数字
ware.read_percent_change_of_user(user, time)
# user 截止到某天(包括这个某天内学习的),已经学习了 ware 多少百分比的内容,返回值是代表百分比的数字
ware.read_percent_of_user(user, time)

chapter.read_percent_change_of_user(user, time)
chapter.read_percent_of_user(user, time)
course.read_percent_change_of_user(user, time)
course.read_percent_of_user(user, time)

# 查询该用户某段时间内的学习情况
# start_time 表示开始日期当天的第一秒(查询结果包含开始日期这一天)
# end_time   表示结束日期当天的第一秒(查询结果包含结束日期这一天)
# 返回结果 [
#   {
#     :user    => user,
#     :course  => course,
#     :chapter => chapter,
#     :ware    => ware,
#     :time    => time,
#     :read_percent_change => read_percent_change,
#     :read_percent => read_percent,
#     :created_at   => created_at,
#     :updated_at   => updated_at
#   },
#   ...
# ]
user.read_status_of_course(start_time, end_time)

有疑惑的地方先找我沟通,没有疑惑后把思路回复在评论内,找我确认无误后再开始编码

ben7th commented 8 years ago

几个问题确认一下:

  1. 应该是 ware_reading 而不是 ware_readings 吧。
  2. ware_reading_delta 上的 time 印象中应该是有特定的表示规则,建议注明。
  3. 一个用户针对同一个小节 ware,一天内能否创建多个 ware_reading_delta 记录?
  4. 既然 ware_reading 上的 read_percent 等于 100 时代表学完了。read 字段是否可以去掉。查询效率是否可以通过给 read_percent 加索引来优化
  5. 印象中一些字段要加索引来优化查询效率
  6. 需要增加一组查询方法,用来查询一个用户在指定的日期或日期范围内学习了哪些课程/章节/小节。之所以把 ware_reading_delta 也设计成直接关联 course/chapter/ware 而不是 belongs_to ware_reading,正是为了便于进行这样的查询。
fushang318 commented 8 years ago

几个问题确认一下:

  1. 应该是 ware_reading 而不是 ware_readings 吧。 已修改
  2. ware_reading_delta 上的 time 印象中应该是有特定的表示规则,建议注明。 已经注明
  3. 一个用户针对同一个小节 ware,一天内能否创建多个 ware_reading_delta 记录? 只能创建一个,已经注明
  4. 既然 ware_reading 上的 read_percent 等于 100 时代表学完了。read 字段是否可以去掉。查询效率是否可以通过给 read_percent 加索引来优化 已经把 read 字段去掉
  5. 印象中一些字段要加索引来优化查询效率 可以加索引优化效率
  6. 需要增加一组查询方法,用来查询一个用户在指定的日期或日期范围内学习了哪些课程/章节/小节。之所以把 ware_reading_delta 也设计成直接关联 course/chapter/ware 而不是 belongs_to ware_reading,正是为了便于进行这样的查询。
    已增加
ben7th commented 8 years ago

按这样来做吧~~