如何在两个模型之间的has_and_belongs_to_many
表中添加多个记录?
我可以弄清楚到目前为止如何创建一条记录,然后更新该记录。我想在连接表中添加多条记录。
现在我有一个collection_select,但更新方法只允许我更新记录,而不是添加新记录。
我最好的猜测是将@group.workouts << workout_id
之类的内容添加到组控制器中的更新方法中,但我无法弄清楚如何让它工作。
我在这里走在正确的轨道上吗?
我正在尝试将训练添加到小组和小组进行训练。
感谢您的帮助!
编辑1:
我有collection_select
允许我在连接表中添加单个记录,但我想弄清楚如何将第二个,第三个等记录添加到连接表中。我的collection_select
是:
<div class="field">
<%= f.collection_select 'workout_ids', Workout.all, :id, :name, { :include_blank => ""} %>
</div>
所以简单地说,我想为一个小组添加锻炼,我可以这样做。然后我想为同一组添加另一个锻炼,然后是另一个,等等。
答案 0 :(得分:5)
编辑:
详细介绍了正确执行此操作的实际方法 所以答案是用控制器来编辑控制器中的更新动作:
workout_id = params[:group].delete(:workout_ids)
# Adding a workout
if workout_id
workout = Workout.find(workout_id)
@group.workouts << workout
end
上面的代码创建了一个局部变量workout_id
,它从:group
中获取参数:workout_id
和:group
.delete
方法删除了第二个参数以进行更新例如,更改组名称时的实际组。
然后,我们只需将新的训练推送到@ group.workouts,每次我们从集合选择中向组添加新的训练时,在联接表中创建新记录。
答案 1 :(得分:2)
在控制台中你可以像猜到的那样:
group.workouts << workout
或
workout.groups += [group_a, group_b, group_c]
在我的头脑中,我认为你想要传递实际的对象,而不仅仅是ID,但它可以双向工作。
在表单构建器中应该能够使用collection_select
:
= form_for @workout do |f|
= f.collection_select :group_id, Group.all, :id, :name, :prompt => true
其他工具如Simple Form的关联方法使这更容易。