无法在rails 5 app中添加连接表的行?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (57)

我有三个表 - 结果,feedback_qs和feedback_qs_results(连接表)。给定现有结果和feedback_qs,我想用join_id,feedback_q_id和后续答案(text_area)填充连接表。

我相信这种关系是正确的:

# 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

这个表单填充连接表会是什么样的?类似的东西(我意识到这是不正确的)......?如何通过post_controller接收数据以填充连接表?或者它应该通过另一个控制器?

<%= 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的多对多关系和填充连接表的问题,但这些用例似乎都不适合我的需要。

提问于
用户回答回答于

改变了原来的模型:

# 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>
用户回答回答于

如果你的has_many关联正常工作,那么在rails控制台中你应该能够做到:

> result.feedback_qs
=> []

> feedback_q.results
=> []

要将feedback_q与结果相关联,只需:

> result.feedback_qs << feedback_q

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

> result.feedback_qs

它应该返回feedback_q你刚刚添加的记录。

扫码关注云+社区

领取腾讯云代金券