我必须通过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 [ ] [ ]
答案 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