加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – has_many:通过模型名称,控制器和属性最佳实践

发布时间:2020-12-17 03:06:36 所属栏目:百科 来源:网络整理
导读:免责声明:我真的花时间思考模型和变量的名称.如果你也这样做,这个问题适合你. 我有一个Rails项目,它包含两个模型:User和Project. 它们通过ProjectsUser模型连接,该模型是多对多关系中的连接模型.此模型还包含用户在给定项目中的角色,以及层和部门等其他属
免责声明:我真的花时间思考模型和变量的名称.如果你也这样做,这个问题适合你.

我有一个Rails项目,它包含两个模型:User和Project.

它们通过ProjectsUser模型连接,该模型是多对多关系中的连接模型.此模型还包含用户在给定项目中的角色,以及层和部门等其他属性.所以这是一个has_many:通过关系.

鉴于这种情况,自从我开始开发它以来,这里一直困扰着我所有的rails项目:

>我应该使用ProjectsUserController还是更好地在UserController和ProjectController上添加相关操作?在某些时候,我想将用户分配给项目,甚至更改给定项目中用户的角色.将这些操作留在连接控制器上或使用模型控制器是否是更好的做法?
>我应该编写一个方法来获取给定项目的用户角色吗?这基本上是我应该有一个方法User#role_for(project).由于这个方法基本上是从projects_user对象获取信息,因此总是让代码明白这一点更有意义,因为大多数时候我会拥有项目和用户,而不是projects_user.这条思路是否正确,或者问题是我的代码上应该有比实际更多的project_user?这有什么好的警告吗?
>如果不明显,我应该尝试将我的表重命名为非标准名称吗?好吧,我知道如果我有模型User和NewsSite,我应该使用has_many:subscriptions,但事实上,根据我的经验,在现实生活中命名这些模型通常更难.当名称最终不那么明显时(例如,在我的情况下,也许是@wonderingtomato建议的project_participation)是最好的,或者在这种情况下最好回退到ProjectsUser方法?

一个额外的cookie用于指向美丽的开源Rails代码,或通过书籍指示可能有助于我的问题.

解决方法

我会使用一个特定的控制器.即使现在交互听起来很简单,您也不知道将来是否需要添加更多高级功能.
我一直在几个项目中处理这种关系,并且使用连接模型的控制器总是得到回报.

您可以通过这种方式构建它,例如:

> index应该使用params [:project_id],这样您就可以只显示特定项目的用户索引.
> create是添加新用户的位置,也就是创建新连接模型的位置.
> update是修改现有连接模型上的值,例如,当您要更新项目中用户的角色时.
> destroy是从项目中删除用户的位置,也就是删除相应连接模型的位置.
>如果您决定在索引视图中管理所有内容,则可能不需要显示和编辑操作.

另外,我建议选择一个不同的名字. 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 :).问问自己:支持实际模型的表格是什么?如果是,该模型代表现实世界中的某些东西,因此应具有适当的名称.另一方面,如果表没有支持模型(例如,它是一个连接表),那么你应该组合它加入的表(模型)的名称.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读