无法添加行以在 rails 5 应用程序中加入 table

Unable to add rows to join table in rails 5 app

我有三个 tables - 结果、feedback_qs 和 feedback_qs_results(加入 table)。给定现有结果和 feedback_qs,我想用 result_id、feedback_q_id 和后续答案 (text_area) 填充联接 table。

我相信关系是正确的....

# result.rb
has_many :feedback_q_results
has_many :feedback_qs, :through => :feedback_q_results

# feedback_q.rb
has_many :feedback_q_results
has_many :results, :through => :feedback_q_results

# feedback_q_result.rb
belongs_to :result
belongs_to :feedback_q

我可以通过下面的 config/routes.rb 访问 result_id (result/result.id/feedback)...

resources :results do
  member do
    get 'feedback'
    post 'feedback_create'
  end
end

填充联接 table 时,此表单会是什么样子?与此类似的东西(我意识到这是不正确的)......?如何通过 post_controller 获取数据以填充连接 table?还是应该通过另一个控制器?

<%= form_for :result, url: feedback_create_result_path(result), method: :post do |form| %>
  <% for q in FeedbackQ.all %>
  <div class="col field">
    <p>
      <%= form.label q.question_text %>
    </p>
    <%= text_area_tag id: q.id %>
  </div>
  <% end %> 

  <div class="actions">
    <%= form.submit "Submit", class: "btn btn-primary" %>
  </div>
<% end %>

我的 feedback_create 方法会是什么样子?虽然我已经看到几个关于 rails' 多对多关系和填充连接 table 的问题,但这些用例中的 none 似乎符合我的需要。提前致谢。

更新 - 我的用例是这样的:用户参加考试(称为结果),然后他们通过回答反馈问题来审查监考人。我要记录反馈加入table

如果您的 has_many 关联工作正常,那么您应该可以在 rails 控制台中执行以下操作:

> result.feedback_qs
=> []

> feedback_q.results
=> []

其中 resultfeedback_q 分别是 ResultFeedbackQ 对象。

要将 feedback_q 关联到结果,只需:

> result.feedback_qs << feedback_q

这应该在 feedback_q_result table 中创建一条记录。 现在,当你这样做时

> result.feedback_qs

它应该 return 您刚刚添加的 feedback_q 记录。

我修改了我原来的模型。我 运行 遇到的一个问题是 rails 中的简单命名约定,因此我简化了 table 名称以将其从等式中删除。新型号:

# result.rb
has_many :feedbacks
has_many :questions, :through => :feedbacks

# question.rb
has_many :feedbacks
has_many :results, :through => :feedbacks

# feedback.rb
belongs_to :question
belongs_to :result
validates_uniqueness_of :question_id, scope: :result_id

我认为的形式:

<%= form_for :result, url: feedback_create_result_path(result), method: :post do |form| %>
    <% Question.all.each do |question| %>
    <div class="col field">
    <p>
        <%= form.label :question, question.question_text %>
    </p>
        <%= hidden_field_tag 'question[][id]', question.id %>
        <%= text_area_tag 'question[][answer]', "", id: "question_" + question.id.to_s, class: "stretch_textarea" %>
    </div>
    <% end %>   

<div class="actions">
    <%= form.submit "Submit", class: "btn btn-primary" %>
</div>

这个 也帮了大忙。