Как обновить отношения многие ко многим в рельсах? - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь обновить отношения многие ко многим между двумя моделями в моем API.У меня есть Teacher и Student модели.

Я могу добавить Student к Teacher, как в моем teachers_controller.rb:

...
def update
  @teacher = Teacher.find(params[:id])
  if teacher_params[:student_id]
    @student = Student.find(teacher_params[:student_id])
    @teacher.students << @student
  end
  @teacher.save
  render json: @teacher, include: 'students', status: :ok
end
...

Однако, скажем,Я хочу удалить отношения ученика с учителем, как я могу это сделать?Единственный способ, которым я могу думать, это найти ученика, затем перебрать массив учеников учителя и удалить совпадение, но не совсем уверен в этом методе.Есть ли лучший способ?

1 Ответ

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

В вашем контроллере попробуйте это:

def update
 @teacher = Teacher.new(parameters)
 if params.has_key?(:students)

    @teacher.students.clear #this removes the reference to all previous students. 
    params[:students].each do |i|
        @teacher.students << Student.find(i)
    end
 end
 @teacher.save!
end

В представлении редактирования вы можете отобразить список флажков, например:

<% @students.each do |i| %>                  
      <li class="list-group-item">
            <%= check_box_tag "students[]", i.id, @teacher.student_ids.include?(i.id) %>
            <%= i.name %>
      </li>
<% end %>

Вы бы просто поместили этот код в вашу форму где-нибудь. Убедитесь, что вы установили @students и @teacher в вашей функции edit в вашем контроллере.

Надеюсь, это поможет.

ПРИМЕЧАНИЕ. Причина, по которой я выбрал поиск каждого учащегося перед добавлением его к справочнику «учитель / учитель» и удалением каждой ссылки на каждого учащегося / учителя в каждом запросе на обновление, была вызвана поддержкой функции безопасности, которую я использовал в недавно созданном приложении. Для моего случая я находил записи, связанные с определенной учетной записью. Вы также можете сохранить ссылки, как @jwoodrow сказал в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...