使用Mongoid数据库设计的多对多关系?

时间:2012-06-13 13:41:42

标签: ruby-on-rails database-design mongoid

我尝试实现以下数据库结构,但在使用mongoid理解如何执行此操作时遇到问题:

我有一个模型文档,一个模型 DocumentTeam 和一个模型员工。用户可以创建文档,并可以选择添加到DocumentTeam的员工。这就是我的地方:

class Document
  embeds_one :document_team
end

class DocumentTeam
  has_many :employees
  embedded_in :document
end

class Employee
  belongs_to :document_teams
end

所以我的问题:如何告诉rails在创建文档时自动将选定的Employee插入到嵌入式DocumentTeam中?

此外,我希望能够列出例如

的所有员工简报
Employee.first.documents

这也可以吗?

感谢提前!

1 个答案:

答案 0 :(得分:1)

在mongoid中,您无法引用嵌入的文档。您可以从嵌入式文档中引用根文档,但不能反过来。即你belongs_to :document_teams中不能Employee。另外,副作用是嵌入式文档中的关系应该是单面的。您可以将建模更改为以下内容以实现您的目标:

class Document
  embeds_one :document_team
end

class DocumentTeam
  has_and_belongs_to_many :employees, inverse_of: nil
  embedded_in :document
end

class Employee
  def documents
    Document.where('document_team.employee_ids' => self.id)
  end
end

这将允许您使用Employee.first.documents,但您不能将其视为关系,并继续执行您可以对关系执行的操作,例如重新分配,推送和提取文档。您必须通过DocumentTeam管理团队和员工关系,但可以直接访问员工文档以供阅读。

PS:Document id不是类的好名字,我猜它可能会在某种情况下与Mongoid :: Document冲突。