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

自联会has_manybelongs_to(一)

鲁洋
2023-03-14

我想建立一个有两种关系的自我加入协会

has_many和belongs_to(一)

我找到了 2 种方法,但我不确定哪一种更准确,例如,在此答案中has_many和belongs_to在同一模型中,员工与经理、经理与员工has_many以及员工belongs_to与经理之间存在关系

解决方案是添加一个名为 manager_id 的字段,因此如果用户是经理,则manager_id将为 null,如果是员工,则manager_id将是经理的 ID。

这些关联看起来像这样:

has_many :employees, class_name: "User", foreign_key: :manager_id
belongs_to :manager, class_name: "User", foreign_key: :manager_id

我在这里找到的第二个解决方案 Rails 协会 - has_many =

这里的解决方案是创建两个单独的表,一个用于posts,另一个用于related_posts,如下所示:

create_table "posts", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "related_posts", :force => true do |t|
    t.integer  "post_id"
    t.integer  "related_post_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

关联如下所示:

class Post < ActiveRecord::Base
  has_many :related_posts_association, :class_name => "RelatedPost"
  has_many :related_posts, :through => :related_posts_association, :source => :related_post
  has_many :inverse_related_posts_association, :class_name => "RelatedPost", :foreign_key => "related_post_id"
  has_many :inverse_related_posts, :through => :inverse_related_posts_association, :source => :post
end

class RelatedPost < ActiveRecord::Base
  belongs_to :post
  belongs_to :related_post, :class_name => "Post"
end

现在我不确定该走哪条路,第一个解决方案看起来很简单,想法是添加一个额外的名为manager_id的字段(或者可以是post_id,如果我们正在处理帖子),它对所有的经理人员都是空的,我想象有很多记录在那个字段上具有空值,这似乎是不正确的...

第二个解决方案看起来不错,但我感觉不对的是关系has_many:inverse_related_posts_association,它看起来像related_post也有其他相关的帖子/或者related_post属于许多帖子(我不确定)。

就我而言,我想要类似帖子has_many related_posts和related_post belongs_to(一个)帖子的东西

共有1个答案

贺俊材
2023-03-14

我会选择第一种选择,除非你有非常令人信服的理由采取第二种方法。这是简单而明显的。而且您以后可以随时重构代码。

只要列与所有记录相关,列中的空值没有什么特别不好的。在您的例子中,manager_id中的空值意味着“此人没有经理”。这里的空值相关吗?我的答案是肯定的。

NULL表示值未知或没有值。Rails语句< code>@person.manager.present?将正确地为定义了经理的人员返回< code>true,为没有经理的人员返回< code>false。当查看任何特定人员的数据库记录时,manager_id字段中的NULL将传达相同的含义。

 类似资料:
  • 问题内容: 我正在尝试将2个不同工作表中的2个单独的列连接起来,以制成更长的列,然后可以从中使用Vlookup。 工作表1 A,B,C,D,E,F,G 工作表2 A,B,C,D,E,F,G 我想将工作表1中的B列和工作表2中的C列连接起来(联合),并找到新列表的Distinct值。我已经为此工作了好几个星期。 谢谢 问题答案: 您可以将ADO与Excel一起使用。

  • 主要内容:MQTT(消息队列遥测传输),SMQTT(安全消息队列遥测传输),CoAP协议,DDS通信协议会话层协议审查消息传递的标准和协议。不同的标准化组织引入了IoT会话层协议。有不同功能和范围的不同类型会话层协议。MQTT和CoAP通过小消息大小,消息管理和轻量级消息开销来满足这些需求。 MQTT(消息队列遥测传输) MQTT(消息队列遥测传输)是IBM于1999年推出的消息传递协议。它最初用于监视物联网中的传感器节点和远程跟踪。它适合小巧,便宜,低内存和低功耗的设备。MQTT在一侧提供应用

  • 问题内容: 我想知道,是否可以使用PostgreSQL将查询结果与自身连接? 问题答案: 您可以使用WITH来做到这一点: 或者通过创建一个包含查询的VIEW并加入该查询: 还是蛮力的方法:两次键入子查询:

  • 我注意到我正在开发的应用程序中有一个奇怪的bug。在修改一个类时,我将一组属性移动到构造函数中进行自动连接,而不是使用字段注入,然而,由于循环依赖关系,这导致我在启动时出错。下面是导致错误的依赖关系的分解: 我正在尝试在TargetClass的内部使用ServiceA 服务A通过其构造函数注入了服务B 通过现场注入,服务B已注入服务C 通过现场注入,ServiceC已注入TargetClass 我

  • 问题内容: 我只是逐渐了解NATURAL JOIN,而SQLite却表现不佳。 和 产生相同(正确)的结果。 但是,如果我省略括号,如下所示: 我看到r1和r2正确连接,但是r3根本没有连接到结果,而是形成了r1 NATURAL JOIN r2,r3的笛卡尔积。 第一个联接结果的属性名称是否存在问题,或者我误解了SQL? 问题答案: 我自己没有使用该数据库,但是根据此文档,SQLite中的所有联接

  • 我有这个存储过程。我的问题是当记录不存在于机构表是不返回任何东西。我想说即使没有记录在机构仍然返回,所以我已经添加了左外JOIN机构和_Agency=IsNull(U._Agency,")在顶部。但仍然不返回值。它是返回值时,我采取A._IsActive=1在最后一行出来。我该怎么办id A._IsActive没有值仍然返回。我尝试了相同的ISNull但不工作。