【问题标题】:HABTM Adding new associations to join tableHABTM 添加新的关联来加入表
【发布时间】:2013-07-30 13:42:08
【问题描述】:

如何在两个模型之间的has_and_belongs_to_many 表中添加多条记录?

到目前为止,我所能做的就是创建一条记录,然后更新该记录。我想向联接表中添加多条记录。

现在我有一个collection_select,但是update方法只允许我更新记录,不能添加新记录。

我最好的猜测是在组控制器的更新方法中添加类似@group.workouts << workout_id 的内容,但我不知道如何让它工作。

我在正确的轨道上吗?

我正在尝试将锻炼添加到组和组到锻炼。

感谢您的帮助!

编辑 1:

我有一个collection_select,它允许我将一条记录添加到连接表中,但我正在尝试弄清楚如何将第二条、第三条等记录添加到连接表中。我的collection_select 是:

<div class="field">
    <%= f.collection_select 'workout_ids', Workout.all, :id, :name, { :include_blank => ""} %>
</div>

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

【问题讨论】:

  • 您正在寻找 has_many :through。我不确定你是否可以用 HABTM 做到这一点
  • 您可以使用 HABTM 做到这一点。您只需要一个集合选择,或其他关联选择工具。
  • 我刚刚更新了我的问题。我可以使用 collection_select 添加一条记录,但我尝试在添加第一条记录后添加其他记录。
  • 使用 multiple: true 选项也可以解决问题。

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


【解决方案1】:

编辑:

正确执行此操作的实际方法在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中获取参数:group:workout_id.delete方法删除了第二个参数,用于在更改名称时更新实际组组,例如。

然后,我们只需将新锻炼推送到@group.workouts,每次我们从集合选择中向组添加新锻炼时,都会在连接表中创建一条新记录。

【讨论】:

    【解决方案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 的关联方法等其他工具使这更容易。

    【讨论】:

    • 感谢您的帮助!表单生成器用于向连接表添加一条记录,但我遇到的问题是向连接表添加额外的记录。所以我可以将一个锻炼分配给一个组,但是我如何将第二个锻炼分配给同一个组,而不是仅仅更新现有记录?这有意义吗?
    • 在表单中选择多个。在 Mac 中按 CMD 键单击,或在 Windows 中按 CNTRL 键单击。或者使集合选择成为复选框。
    • 这是个好主意,但我想做的比这更有活力。我希望将来能够添加记录,而不会冒丢失过去数据的风险。
    猜你喜欢
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多