1

如何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>

很简单,我想在一个小组中添加一个锻炼,我可以做到。然后我想在同一组中添加另一个锻炼,然后是另一个,等等。

4

2 回答 2

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,每次我们从集合选择中向组中添加一个新的锻炼时,都会在连接表中创建一个新记录。

于 2013-04-21T23:44:55.960 回答
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的关联方法使这更容易。

于 2013-04-19T19:10:25.853 回答