当前位置: 首页 > 知识库问答 >
问题:

多对多的自我加入轨道?

杜翰林
2023-03-14

Rails文档很好地解释了如何处理只需要has_many-belongs_to关系的自连接。在本例中,一个雇员(作为经理)可以有许多雇员(每个雇员都是下属)。

但是,如何处理has_many has_many自加入(我听说这被称为双向循环关联)?

例如,您如何处理员工可以有许多下属作为经理的情况,也可以有许多经理作为下属的情况?

或者,换句话说,一个用户在哪里可以关注很多用户,被很多用户关注?

共有1个答案

潘兴朝
2023-03-14

一个用户可以有很多:

  • 追随者作为追随者
  • 追随者以其追随者的身份。

下面是用户的代码。rb可能看起来:

class User < ActiveRecord::Base
  # follower_follows "names" the Follow join table for accessing through the follower association
  has_many :follower_follows, foreign_key: :followee_id, class_name: "Follow" 
  # source: :follower matches with the belong_to :follower identification in the Follow model 
  has_many :followers, through: :follower_follows, source: :follower

  # followee_follows "names" the Follow join table for accessing through the followee association
  has_many :followee_follows, foreign_key: :follower_id, class_name: "Follow"    
  # source: :followee matches with the belong_to :followee identification in the Follow model   
  has_many :followees, through: :followee_follows, source: :followee
end

下面是follow.rb的代码:

class Follow < ActiveRecord::Base
  belongs_to :follower, foreign_key: "follower_id", class_name: "User"
  belongs_to :followee, foreign_key: "followee_id", class_name: "User"
end

需要注意的最重要的事情可能是user.rb中的术语< code>:follower_follows和< code >:followeee _ follows 。以一个普通(非循环)关联为例,一个团队可能有许多< code >球员到< code >:合同。这对于一个玩家来说没有什么不同,他可能有很多< code>:teams到< code>:contracts(在这个玩家的职业生涯中)。

但是在这种情况下,如果只有一个命名模型存在(即用户),相同地命名通过:关系(例如通过::跟随)将导致连接表的不同用例(或接入点)的命名冲突。:follower_follows:followee_follows是为了避免这种命名冲突而创建的。

现在,一个用户可以有许多:follower:follower_follows和许多:folowee:folowee_follows:

    < li >为了确定用户的:followeed es(在< code > @ User . followeed es 调用数据库时),Rails现在可以查看class_name的每个实例:“Follow ”,其中该用户是follower(即< code > foreign _ key::follower _ id )到:该用户的:followeed es。 < li >为了确定用户的:追随者(在< code>@user.followers调用数据库时),Rails现在可以查看class_name的每个实例:“Follow ”,其中该用户是追随者(即< code > foreign _ key::followee _ id )到:该用户的:follower _ follows。
 类似资料:
  • 问题内容: 我有三个表:应用程序,权限和applications_permissions 对于应用程序,有两类:免费和商业类(价格=‘0’和价格!=‘0’) 现在,我想为每个许可都知道有多少百分比的应用程序引用了它。而这两个类别 自由: 商业的: 我已经计算出以下查询,但其中不包含没有应用程序的权限ID:/ 我该怎么做呢?我已经尝试了几个小时了(该查询,其他联接),但这使我难以捉摸:/ 问题答案:

  • 基本上,我想知道如果我有topic1和topic2会发生什么,因为topic1可以有N个topic2元素。 Topic1是用户的事件,topic2是该用户的配置。作为第一步,我将通过key匹配它们,从topic2中过滤掉不属于该用户的配置,但我仍然有多个匹配项。我需要向topic2添加更多过滤器来找到精确的匹配项,但我不知道在按key连接之后是否可以这样做。 我读到这个:Kafka Stream和

  • 问题内容: 我们已经为此苦苦挣扎了几天,并在网络上进行了大量搜索。 我们试图弄清楚条目如何以Django形式保存到许多字段。 例如,我们有一个新闻模型,该模型与图像具有多对多的关系。当我们将图像添加到新闻文章中时,例如ID为10、2、14的图像,我们可以看到保存新闻文章表单时的帖子值如下: photos 10 photos 2 photos 14 当我们查看多对多交叉表时,顺序没有保留。我们看不到

  • 我有4个rdd类型的RDD:((int,int,int),values),我的rdds是 如何加入RDD,比如rdd1加入“A”上的rdd2;rdd1加入“B”上的rdd2;rdd1加入“C”上的rdd3 那么在Scala中的输出是? 例 输出应该是

  • 我看过这些网站: python相对导入示例代码不起作用 第十亿次相对进口 https://peps.python.org/pep-0328/ Python包:相对导入 Python中的相对导入 并且加载了更多我没有展示的内容,但是它们(答案/代码)由于某种原因无法相对导入其他Python“模块”。而且,我总是有这样一个永远重复出现的错误:< code>ImportError:在没有已知父包的情况下

  • 问题内容: 好的,所以这可能是一个琐碎的问题,但是我在可视化和理解差异以及何时使用它们方面遇到困难。对于诸如单向和双向映射之类的概念如何影响一对多/多对多关系,我也还不清楚。我现在正在使用Hibernate,因此任何与ORM相关的解释都将有所帮助。 举例来说,我有以下设置: 那么在这种情况下,我将进行哪种映射?对于这个特定示例的答案肯定会受到赞赏,但我也确实希望获得何时使用一对多和多对多以及何时使