将额外属性添加到多对多连接表

时间:2017-09-07 15:04:19

标签: ruby-on-rails forms many-to-many

我必须通过has_and_belongs_to_many :users/:geo_scenes为User和GeoScene建立多对多关系模型。在用户表单中,可以为用户分配访问geo_scenes的权限。列出的所有geo_scenes都带有一个复选框 - 对于每个选中的geo_scene,在发送表单后会创建连接表geo_scenes_users中的记录:

--- First User ---

Geo Scene One   [ ]
Geo Scene Two   [x]
Geo Scene Three [ ]

目前的表格:

= form_for(@user) do |form|
...
  = hidden_field_tag("user[geo_scene_ids][]", nil)
    - GeoScene.all.each do |s|
      .checkbox
         %label
           = check_box_tag("user[geo_scene_ids][]", s.id, s.id.in?(@user.geo_scenes.collect(&:id)))
           = s.name

控制器需要强大的参数:

  def user_params
    params.require(:user).permit(:email, :password, :password_confirmation, { geo_scene_ids:[] })
  end

现在的问题是:

如何操作连接表中的额外布尔属性write。每个GeoScene都应该有第二个复选框,允许更新write。 geo_scenes_users的示例行如下所示:

user_id | geo_scene_id | write
------------------------------
1       | 1            | true

我想我需要删除has_and_belongs_to_many快捷方式并构建一个额外的连接模型。但是,我如何管理表单中的复选框列表呢?

--- First User ---

Geo Scene       read  write
---------------------------
Geo Scene One   [x]   [ ]
Geo Scene Two   [x]   [x]
Geo Scene Three [ ]   [ ]

1 个答案:

答案 0 :(得分:0)

您的表单不会改变。只需添加连接模型和关联。 collection_singular_ids=(ids)geo_scene_ids=(ids)都可以使用has_and_belongs_to_many方法(在您的情况下为has_many associations)。

http://guides.rubyonrails.org/association_basics.html#has-many-association-reference

class GeoScenesUser # join model
  belongs_to :geo_scene
  belongs_to :user
end

class User
  has_many :geo_scenes_users
  has_many :geo_scenes, through: :geo_scenes_users
end

之后,您可以使用User#geo_scene_ids=(ids)方法,当您从表单中传递geo_scene_ids时,该方法将有效,就像您使用has_and_belongs_to_many

一样