从一个模型的问题中获取数据库驱动并将答案保存到另一个模型

时间:2014-11-22 07:58:37

标签: ruby-on-rails forms ruby-on-rails-4

我正在尝试使用rails创建一个灵活的数据库驱动表单系统,并且在根据方法生成实际表单时我遇到了一些麻烦。

我接近它的方法是使用一个模型作为表单索引(称之为MyForms),这是一个处理所有表单问题的模型(称之为MyQuestions )以及处理表单所有答案的模型(称之为MyAnswers)。表单和问题已按以下方式存储到数据库中:

mysql> select * from my_forms;                                                                                                                                                   
+----+------------+---------+---------------------+---------------------+                                                                                                           
| id | title      | company | created_at          | updated_at          |                                                                                                           
+----+------------+---------+---------------------+---------------------+
|  1 | First_Form |       1 | 2014-11-20 20:58:53 | 2014-11-20 20:58:53 |
+----+------------+---------+---------------------+---------------------+


mysql> select * from questions;
+----+--------------+-----------------+---------------+---------------------------------------------------------------------+---------------------+---------------------+
| id | my_form_id | question_number | question_type | the_question                                                        | created_at          | updated_at          |
+----+--------------+-----------------+---------------+---------------------------------------------------------------------+---------------------+---------------------+
|  1 |            1 |               1 | string        | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
|  2 |            1 |               2 | radio         | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
|  3 |            1 |               3 | check         | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
|  4 |            1 |               4 | radio         | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
|  5 |            1 |               5 | text-box      | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
|  6 |            1 |               6 | string        | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
|  7 |            1 |               7 | string        | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
|  8 |            1 |               8 | text-box      | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
|  9 |            1 |               9 | check         | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
| 10 |            1 |              10 | check         | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
+----+--------------+-----------------+---------------+---------------------------------------------------------------------+---------------------+---------------------+

答案数据库(当前为空)的结构如下:

mysql> show columns in answers;
+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| id              | int(11)  | NO   | PRI | NULL    | auto_increment |
| question_id     | int(11)  | YES  | MUL | NULL    |                |
| user_id         | int(11)  | YES  |     | NULL    |                |
| question_number | int(11)  | YES  |     | NULL    |                |
| the_answer      | text     | YES  |     | NULL    |                |
| created_at      | datetime | YES  |     | NULL    |                |
| updated_at      | datetime | YES  |     | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+

通过这种方式,无论我想发布多少表格,问题/表格或其他任何要求,我都能以最小的麻烦运行它们。

现在,我可以使用show中的legal_forms_controller.rb使用以下内容轻松地显示问题:

def show
  @legalform = LegalForm.find(params[:id])
  @questions = @legalform.questions
end

然后将其显示在show.html.erb中,如下所示

<% @questions.each do |client| %>
    <span><%= client.the_question %></span><br/>
<% end %>

但我正在努力弄清楚如何将这些与表单输入字段配对并将它们保存到答案数据库中。我认为得到一个空白的答案可能涉及创建一个答案控制器,然后使用new方法,然后我可以使用一些条件在视图中创建正确的输入类型,给定question type。但是,我不太清楚如何有效地创建此表单,然后在给定此方法的情况下保存数据。任何有关这方面的帮助将不胜感激。 (当然是“善良的上帝,为什么你这样做,你应该做......”的反应也是可以接受的。)

1 个答案:

答案 0 :(得分:0)

我会将其建模为:

# column :label, TEXT - the text body of the question
# column :input_type, VARCHAR - maps to html input types
# ...
class Question 
    has_many :answers # since there may be several acceptable answers or options
end

# column :is_correct, BOOL
# column :text, TEXT
class Answer
    belongs_to :question
end

# Or test 
class Test
    has_many :questions
    has_many :test_scores

    # generate a test with random questions
    def self.random(seed = nil)
        # ...
    end
end

class TestScore
    belongs_to :user
    belongs_to :test
end

这使我们可以在test&amp; user(假设您有某种用户模型)。

您还可以构建允许管理员创建测试,问题和答案的用户界面。

要管理测试,您可以使用TestScoreController:

class TestScoreController
    # administer a test
    def new
        @score = TestScore.new(user_id: current_user)
        @score.test = @test = Test.random()
    end

    # corrects test
    def create
        # ...
    end

    # Show a test result
    def show
       @score = TestScore.find(params[:id]).joins(:test)
    end
end

视图:new.html.erb

<%= form_for(@score) do %>
    <%= @test.questions.each do |q| %>
        <%= f.fields_for :questions, question do |q| -%>
            <%= f.label q.label %>
            <%= QuestionHelper.input(q) %>
            <%= q.hidden_field :test_score_id, @score.id %>
        <%= end %>
    <%= end %>
<%= end %>

然后,您将创建一个辅助方法,该方法接受一个问题并返回输入。我建议simple_form,因为它有一个DSL,可以快速动态生成输入。

# app/helpers/question_helper
module QuestionHelper
    def self.input(question)
        case question.input_type.to_sym
        when :text
        when :radio_button
        # ..    
        end
    end
end