ruby-on-rails – has_many:通过模型名称,控制器和属性最佳实践
免责声明:我真的花时间思考模型和变量的名称.如果你也这样做,这个问题适合你.
我有一个Rails项目,它包含两个模型:User和Project. 它们通过ProjectsUser模型连接,该模型是多对多关系中的连接模型.此模型还包含用户在给定项目中的角色,以及层和部门等其他属性.所以这是一个has_many:通过关系. 鉴于这种情况,自从我开始开发它以来,这里一直困扰着我所有的rails项目: >我应该使用ProjectsUserController还是更好地在UserController和ProjectController上添加相关操作?在某些时候,我想将用户分配给项目,甚至更改给定项目中用户的角色.将这些操作留在连接控制器上或使用模型控制器是否是更好的做法? 一个额外的cookie用于指向美丽的开源Rails代码,或通过书籍指示可能有助于我的问题. 解决方法
我会使用一个特定的控制器.即使现在交互听起来很简单,您也不知道将来是否需要添加更多高级功能.
我一直在几个项目中处理这种关系,并且使用连接模型的控制器总是得到回报. 您可以通过这种方式构建它,例如: > index应该使用params [:project_id],这样您就可以只显示特定项目的用户索引. 另外,我建议选择一个不同的名字. Rails在很大程度上依赖于命名约定,而projects_users是您将与has_and_belongs_to_many关联一起使用的join_table的默认名称.从理论上讲,你可以将它用于一个独立的模型(以及一个has_many到:),但它并不是很明确,你可能会破坏某些东西.另外,它会让任何可能在未来加入该项目的新程序员(个人经历)感到困惑. 如何将模型称为project_participation? 如果您还没有构建很多功能,并且还没有生产该表,那么现在更改它将为您节省很多麻烦. 更新 1)我支持我前面所说的:你的连接模型是一个完整的记录,它保存状态,可以被提取,修改(由用户)并被销毁. 2)您可以定义User#role_for(project),只需记住它应该正确处理用户未参与项目的情况. 您还可以使用以下内容明确说明: @user.project_participations.where(project_id: @project.id).first.try(:role) # or... ProjectParticipation.find_by(project_id: @project.id,user_id: @user.id).try(:role) 但是我会说将这个逻辑封装在一个方法中(在两个模型中的一个上)会更好. 3)您已经在为表使用非标准名称.我的意思是它是不同类型关联的默认名称(has_and_belongs_to_many),而不是您正在使用的关联(has_many through :).问问自己:支持实际模型的表格是什么?如果是,该模型代表现实世界中的某些东西,因此应具有适当的名称.另一方面,如果表没有支持模型(例如,它是一个连接表),那么你应该组合它加入的表(模型)的名称. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |