Невозможно добавить строки в таблицу соединений в приложении rails 5 - PullRequest
0 голосов
/ 30 мая 2018

У меня есть три таблицы - результат, feedback_qs и feedback_qs_results (таблица присоединения).Учитывая существующий результат и feedback_qs, я хочу заполнить таблицу соединения с result_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

У меня есть доступ к result_id (result / result.id / feedback) через config / rout.rb ниже ...

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?Несмотря на то, что я видел несколько вопросов, касающихся отношений «многие ко многим» рельсов и заполнения таблиц соединений, ни один из этих вариантов использования, по-видимому, не отвечает моим потребностям.Заранее спасибо.

Обновление. Мой пример использования такой: пользователь сдает экзамен (называемый результатом), а затем проверяет проктора, отвечая на вопросы обратной связи.Я хочу записать отзыв в объединительной таблице

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Я изменил свои оригинальные модели.Одной из проблем, с которой я столкнулся, было простое соглашение об именах в 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>

Эта ТА страница также помогла.

0 голосов
/ 30 мая 2018

Если ваши ассоциации has_many работают правильно, то в консоли rails вы сможете сделать:

> result.feedback_qs
=> []

и

> feedback_q.results
=> []

Где result и feedback_qявляются объектами Result и FeedbackQ соответственно.

Чтобы связать результат обратной связи с результатом, просто:

> result.feedback_qs << feedback_q

Это должно создать запись в таблице feedback_q_result.Теперь, когда вы делаете

> result.feedback_qs

, он должен вернуть запись feedback_q, которую вы только что добавили.

...