Rails 5 - 带有2个字段的模型,指向同一个对象

时间:2016-10-03 11:47:52

标签: ruby-on-rails ruby-on-rails-5

在我正在构建学习RoR的应用程序中,我有一个模型“Document”和一个模型“Business Partner”。在“文档”模型中,我有两个字段(“发件人”和“接收者”),指的是“业务合作伙伴”模型。

如何使用不同的字段对belongs_to同一个目标进行两次建模?迁移应该是什么?

相关问题:如何为业务合作伙伴建立与自身的关系模型?即一家公司有很多商业伙伴,但也可以成为商业伙伴。注意 - 不是同一记录(公司A不能与公司A(本身)建立关系。

1 个答案:

答案 0 :(得分:2)

假设您的sender_id模型(即receiver_id表)上的发件人和收件人关系列Documentdocuments,您可以做这样的事情:

class Document < ActiveRecord::Base
  belongs_to :sender, class_name: "BusinessPartner"
  belongs_to :receiver, class_name: "BusinessPartner"
end

只要您在桌面上找到了这些列,就没有特别的迁移(如果您已将其他内容命名为其他内容,则只需替换sender和{{ 1}}以上任何列名减去receiver部分。)

然后是您的_id型号:

BusinessPartner

此处,class BusinessPartner < ActiveRecord::Base has_many :sent_documents, class_name: "Document", foreign_key: "sender_id" has_many :received_documents, class_name: "Document", foreign_key: "receiver_id" end 将获取sent_documents表中documentssender_id的ID匹配的所有行,以及BusinessPartner的相似内容。

Rails docs中的更多信息。

关于你的第二个问题,有一个section of the Rails docs描述了它,它被称为&#34; Self Joins&#34;。但是,考虑到您要建模多对多关系,您需要一个稍微特殊的表格排列。有关如何设置该安排的一些详细信息,请参阅this SO answer。这本身实际上是一个有点棘手的话题,如果你对细节感兴趣,我建议就此问一个单独的问题(虽然SO帖子很好地回答了它)。