HABTM添加新关联以加入表

时间:2013-04-19 19:01:46

标签: ruby-on-rails has-and-belongs-to-many

如何在两个模型之间的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>

所以简单地说,我想为一个小组添加锻炼,我可以这样做。然后我想为同一组添加另一个锻炼,然后是另一个,等等。

2 个答案:

答案 0 :(得分:5)

编辑:

this Gist

详细介绍了正确执行此操作的实际方法

所以答案是用控制器来编辑控制器中的更新动作:

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的关联方法使这更容易。