新手问题 [求助] 怎么用 Rails 写出选择题的试卷,Multiple choice quiz

Vdan · 2017年05月27日 · 最后由 xdoc 回复于 2017年10月12日 · 2712 次阅读

技术大咖,老鸟们,前辈们,我又来请教问题了。

如上图,我想用 rails 写出这种功效的网站。但是一上午查到的资源只有 surveyor 的 gem,然后我还拆的不太懂。很惊喜的翻到了这个网站,https://css-tricks.com/examples/Quiz/
但是不爽的是这个是用 PHP 写的。。。

大神们,你们见过的市面多,吃过的大米饭多。我想请问,有没有相关的 gem 包可以解决的,或者是 一些核心的算法,怎么实现选择功能的?求点拨,求开导。

小的在此言谢。

我知道我问的这个问题很大。那我说说我现在的想法:建立了三个 model,question, answer 和 user answer。question 和 answer 的 关系我知道怎么处理,但是不知道怎么将 考生填写的 user answer 这个表单,和 answer 这个表单相匹配,然后得出结果。

我还搜到了关键字,select_tag,check_box, 多态

我还能想到是不是可以 用 case when 的方式转换这几种条件。

但是不知道怎么把这些零件,组装成个我想用的轮子。

上述都是我的想法,初级小白的想法。坐标:北京,求大神约茶。

我能实现的是,一道题,submit 一下,这样很 low 逼。我还能实现的是,一道答案,定义了是或否,但是 4 个答案,需要写 8 次。很 low,我冥冥之中能感觉到,这个轮子已经被人造出来了,我就是不知道在哪能找到。😅 😅 😅 😅 😅 😅 😅 我还找到了别人用 HTML 和 CSS 实现的选择题的样板。

一个试题 model 一个试卷的 model 一个回答结果的 , 估计 没有现成的东西,试题组成试卷,考生选择试卷进行作答

3 楼 已删除

Question(id, content)
Option(id, question_id, content, isCorrect)
UserAnswer(id, user_id, question_id, option_id)

四个表

Question.has_many :options
Option.belongs_to :question
Option.has_many :users, through :answers
User.has_many :options, througn :answers

这个很简单啊,表分 question 表,answer 表, question.rb

has_many: answers

answer.rb

belongs_to: question
question: id, title, correct
answer: name, content, question_id

如:

question: id: 1, title: 张三为什么叫张三?, correct: A

answer: id:1, name: A, content: 因为他姓张, question_id: 1

answer: id: 2, name: B, content: 因为他爸姓张, question_id: 1

然后在 controller 中直接查就行了,比如

@questions = Question.order(id: :desc).includes(:answers).limit(10)

然后就是 view 中显示了,最后提交时,获取 question 的 id 和用户选择的答案,和正确的对比就行了

首先,我们来选个切入方向, 这里我就从用户的角度入手。
step by step:

  1. 用户最能直观感感受到的其实就一部分,试卷TestPaper
    这里就要分我们要不要对用户的答卷做记录,如果要记录的话就需要用户答卷记录表AnswerPaper; 这里我假定需要记录,所以目前就有 2 个主要 modelTestPaperAnswerPaper

  2. TestPaper 部分
    试卷无非就是问题Question和答案Answer组成的,这里面会有很多跟具体场景关联的细节的问题,编码的时候根据需求再扯。

  3. AnswerPaper
    我们很容易从试卷的结构分析出答卷的详情的AnswerPaperDetail内容。

  4. 下面进入拟表环节
    我这里按我的理解简单罗列一下就行了,具体看你自己根据实际需求:

    # 这里看你需不需要用相同试题记录生成不同的试卷,如果不需要的话,直接把`test_paper_id`加到`Question`.这里就不需要question_ids数组了
    TestPaper(id: uuid, name: string, code: string, question_ids: text);
    AnswerPaper(id: uuid, test_paper_id: uuid, user_id: uuid);
    # q_type主要用于判断问题类型(单选题、多选题、填空题),category_id判断问题所属的行业或者年级,算了越拓展这表越大,自己看着办。
    Question(id: uuid, content: string, q_type: string, order_num: integer, category_id: uuid)
    Answer(id: uuid, content: string, order_num: integer, is_right: boolean)
    # answer可以存放不同类型问题的答案,如果你只有选择题可以存放answer_ids
    AnswerPaperDetail(id: uuid, answer_paper_id: uuid, question_id: uuid, answer: text)
    
  5. 表之间的关联应该很清楚了吧,我还有事就不写了 (表之间关联的分析应该在拟表之前)

以上就是我的分析过程。

有一个哥们写的答题网站,我觉得非常符合你的需求,推荐一下。 https://github.com/BranLiang/project_surveyor

hemengzhi88 回复

谢谢您的分享,对我很有帮助,谢谢。

有几处不太理解,还请大侠多指教

1. TestPaper 中的 code 字段做什么用?

TestPaper(id: uuid, name: string, code: string, question_ids: text);

2. 请问 QuestionAnswer 中的 order_num 是做什么用途,是将问题与答案关联起来吗?是否需要在 Answer 中添加 question_id

3. 如果还想统计用户对同一道题做错的情况(比如错误次数,wrong_count ),这样可以根据错误次数多少生成一张易错题试卷,请问是如何处理这种情况呢?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号