ruby-on-rails - Rails 5 - 具有 2 个字段引用同一对象的模型

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

在我正在构建的用于学习 RoR 的应用程序中,我有一个模型“文档”和一个模型“业务合作伙伴”。在“文档”模型上,我有 2 个字段(“发送者”和“接收者”)引用模型“业务合作伙伴”。

如何为具有不同字段的同一目标建模两次?迁移应该是什么?

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

最佳答案

假设您的 Document 模型(即您的 文档表),你可以这样做:

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

只要您将这些列放在表格中,就没有特殊的迁移(如果您将它们命名为其他名称,只需替换 senderreceiver 上面的任何列名称减去 _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 将获取 documents 表中 sender_idBusinessPartner 的 ID 匹配的所有行,与 received_documents 类似。

更多信息请参见 Rails docs .

关于你的第二个问题,有一个section of the Rails docs描述这一点,称为“自连接”。但是,考虑到您想要对多对多关系进行建模,您将需要稍微特殊的表排列。请参阅this SO answer有关如何设置该安排的一些详细信息。这实际上是一个有点棘手的话题,如果您对细节感兴趣,我建议您提出一个单独的问题(尽管那篇文章回答得很好)。

关于ruby-on-rails - Rails 5 - 具有 2 个字段引用同一对象的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39830869/

相关文章:

ruby-on-rails - 指示当前登录的用户

ruby-on-rails - Rails控制台和bundle控制台有什么区别?

ruby-on-rails - 您可以将 Redis 与 Resque 一起使用吗?

ruby-on-rails - 为什么在更新用户时 current_user session 变为 nil?

ruby-on-rails - 设计与 devise_token_auth : How to handle authentication for both a web app and API

ruby-on-rails - 如何在 :if validation 中使用枚举值

ruby-on-rails - Rails 5.2.3 中的 csp_meta_tag 是什么,它是如何工作的?

ruby-on-rails - 为什么 Cucumber 会自动加载功能/支持之外的 .rb 文件

ruby-on-rails - 如何配置 config.ru 以使 Resque 在 Heroku 上运行?

ruby-on-rails - rails 5 : find_or_create_by not saving all the params