gpt4 book ai didi

ruby-on-rails - has_many :through model names, Controller 和属性最佳实践?

转载 作者:行者123 更新时间:2023-12-04 03:37:44 25 4
gpt4 key购买 nike

免责声明:我真的花时间思考模型和变量的名称。如果你也这样做,这个问题是给你的。

我有一个包含两个模型的 Rails 项目:UserProject .

它们通过模型 ProjectsUser 相连,这是多对多关系中的连接模型。该型号还拥有 role给定项目中的用户,以及其他属性,例如 tierdepartments .所以这是一个 has_many :through关系。

鉴于这种情况,以下是自从我开始开发以来一直困扰我所有 Rails 项目的所有内容:

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

  • 一个额外的 cookie 用于指向漂亮的开源 Rails 代码,或者可能有助于解决我的问题的书籍指示。

    最佳答案

    我会使用特定的 Controller 。即使现在交互听起来很简单,您也不知道将来是否需要添加更多高级功能。
    我一直在几个项目中处理这些类型的关系,并且对连接模型使用 Controller 总是有返回的。

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

  • index应该期待 params[:project_id] ,以便您可以仅显示特定项目的用户索引。
  • create是您添加新用户的地方,也就是您创建新加入模型的地方。
  • update是修改现有联接模型上的值,例如,当您要更新项目中用户的角色时。
  • destroy是从项目中删除用户的地方,也就是删除相应的联接模型的地方。
  • 您可能不需要 showedit操作,如果您决定管理 index 中的所有内容看法。

  • 另外,我建议选择不同的名称。 Rails 严重依赖命名约定,而 projects_users 的默认名称join_table 你会使用 has_and_belongs_to_many协会。理论上你 可以 将它用于独立模型(和 has_many through: ),但它不是很清楚,你可能会破坏某些东西。上瘾的是,它会使任何可能在 future 加入该项目的新程序员(个人经验)感到困惑。

    将模型称为 project_participation 怎么样? ?

    如果您还没有构建很多功能,并且还没有在生产中使用该表,那么现在更改它会在将来为您省去很多麻烦。

    更新

    1)我支持我之前所说的:您的连接模型是一个完整的记录,它保存状态,可以(由用户)获取、修改和销毁。
    专用 Controller 是必经之路。此外,该 Controller 应该处理修改连接模型的所有操作,即更改其属性。

    2) 您可以定义 User#role_for(project) ,只要记住它应该正确处理 user的情况。不参加 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: )。
    问问自己:该表是否支持实际模型?如果是,该模型代表现实世界中的某些东西,因此应该有一个合适的名称。另一方面,如果表是 不是 支持模型(例如,它是一个连接表),那么您应该组合它所连接的表(模型)的名称。

    关于ruby-on-rails - has_many :through model names, Controller 和属性最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21804336/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com