我正在寻找一些关于如何在我的 Rails 模型中实现我所说的“虚拟关联”的指导。
我将用我考虑过的真正关联路径(HABTM)的免责声明作为开头,但据我所知,这会与我已经实现的概念相冲突。
我目前有一个Project
模型,可以User
通过roles
. 例如, aProject
可能有很多site_managers
,construction_managers
和project_managers
。Asite_manager
也可以是project_manager
相同或不同的 a projects
(排除单表继承)。
使用 Rolify gem,这很容易实现。我可以将上述任何角色分配给特定项目中的特定用户sample_user.add_role(:site_manager, sample_project)
。
我的目标之一是能够创建一个表单,我可以在其中设置一个新项目,并使用多选列表为用户分配角色。例如,我的表单将具有以下输入,以将选定的用户分配为新项目的站点经理:
= f.input :site_managers, collection: User.all, input_html: { multiple: true }
(Formtastic DSL)
这是事情变得稍微复杂的地方。我已经设法为site_maanagers
属性实现了一个自定义 getter/setter,我可以在其中获取表单传递的 user_ids 的哈希值,并根据需要获取/更新适当的记录。
然而,这个实现与真正的关联远非相似,我可以做一些事情,比如在 with 中添加一个单一user
的。site_managers
sample_project.site_managers << sample_user
目前我也无法使用用户实例设置 site_managers 数组。我的自定义设置器仅将user_ids
参数作为参数,在表单提交实现之外使用时有点麻烦且不是很直观。我可以通过检查 setter 方法中的类型来轻松解决这个问题,但它感觉很骇人,而且不像 Rails。
我已经尝试放弃整个自定义 getter/setter 并使用使用连接表来管理所有这些记录的 HABTM 实现,但我担心如果/当我们需要向项目添加更多角色时,这将无法很好地扩展(每个角色都会向连接表添加一个额外的列)。它也最终让人觉得我在复制 Rolify 已经提供的功能/概念,所以在某些地方我正在检查连接表中的角色并在其他地方使用 Rolify(即,如果用户是管理员或有权访问某些资源)。
还有什么我可能忽略的或者这是完成这项工作的唯一方法吗?
谢谢,我期待听到您的一些意见。
罗格