【问题标题】:Rails: Multiple many-to-many relationships (more than two)Rails:多个多对多关系(两个以上)
【发布时间】:2016-02-09 13:21:48
【问题描述】:

Rails 新手在这里。

在将模型从 Django 移植到 Rails 时,我对寻找最佳关系感到困惑......

我想实现的模型:

  • 角色(有很多用户和团队)
  • 用户(拥有许多角色和软件)
  • 软件(有很多用户和一个团队)
  • 团队(拥有许多软件和文档)
  • 补丁(有很多团队和软件)
  • 文档(包含许多团队和软件)

是否可以通过或更好地使用 has_and_belongs_to 与 has_many: 建立关联?

我认为:通过关联会很复杂,因为给定模型有两个以上的交叉关系。

我可以看到两种建立关系的方式:一种大连接模型或小连接模型,用于当前所有模型之间的多对多关系。

class Role
  has_many :relations
  has_many :users, through: :relations
  has_many :teams, through: :relations
end

class User
  has_many :relations
  has_many :roles, through: :relations
  has_many :software, through: :relations
end

class Team
  has_many :relations
  has_many :software, through: :relations
end

class Software
  has_many :relations
  has_many :users, through: :relations
  has_one :team
end

class Relation
  belongs_to :user
  belongs_to :role
  belongs_to :teams
  belongs_to :software
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 many-to-many


    【解决方案1】:

    has_many :through 为您提供了拥有功能齐全的连接模型类的额外灵活性。如果您想要对关系的某些方面进行建模,而不仅仅是两件事相互关联这一简单事实,则需要这样做。

    据我所知,has_many :through 没有任何缺点,除了您的代码库可能要大一两行之外,还有很多优点。我会一直使用has_many: through

    关联很复杂:在进行任何编码之前,用纸和铅笔(或 UML 绘图应用程序,如果您愿意)将它们全部画出来。如果您之前有一个可以工作的 django 应用程序,那么它应该足够简单地映射架构:它们都是对象关系系统。

    【讨论】:

    • 我有一个图表 :) 但只是想不出如何在没有缺陷的情况下实现它......我不认为 join 模型类有利于存储多个(两个以上)关系。还是我错了?
    • 我不知道你所说的“多重关系”是什么意思。连接表用于对多对多关系建模,例如用户和组之间的关系,其中一个用户可以在许多组中,而一个组有许多用户。连接表/模型将被称为“group_users”或“group_memberships”或其他名称,每个连接表记录都有一个 group_id 和一个 user_id。
    • 哦,等等,我明白你的意思是用一个类关系来处理所有不同类之间的所有关系。为了简单起见,我建议不要这样做,而是为每个多对多关系加入一个连接。你可以这样做(查找多态性),但它会让事情变得更复杂,而且没有太多好处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2019-12-29
    • 2014-10-09
    • 2020-05-02
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多