如何更新rails中的多对多关系?

时间:2018-05-08 16:20:57

标签: ruby-on-rails

我正在尝试更新API中两个模型之间的多对多关系。我有TeacherStudent型号。

我可以将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 :(得分:0)

在你的控制器中试试这个:

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功能中设置@teacheredit

希望这会有所帮助。

注意:我之前选择查找每个学生,然后将其添加到学生/教师参考并删除每个更新请求的每个学生/教师参考的原因是由于维护了我在最近创建的应用中使用的安全功能。对于我的情况,我找到了某个帐户下的相关记录。您还可以在评论中保存像@jwoodrow这样的引用。