1

次のデータベース構造を実装しようとしましたが、mongoid を使用して実装する方法を理解するのに問題があります。

モデルDocuments、モデルDocumentTeam、およびモデルEmployeesがあります。ユーザーはドキュメントを作成し、DocumentTeam に追加される従業員を選択できます。これは私がいる場所です:

class Document
  embeds_one :document_team
end

class DocumentTeam
  has_many :employees
  embedded_in :document
end

class Employee
  belongs_to :document_teams
end

だから私の質問:ドキュメントを作成するときに、選択した従業員を埋め込まれたDocumentTeamに自動的に挿入するようにレールに指示するにはどうすればよいですか?

さらに、たとえば、従業員のすべてのブリーフィングをリストできるようにしたい

Employee.first.documents

これも可能ですか?

よろしくお願いします!

4

1 に答える 1

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: Documentid はクラスに適した名前ではありません。シナリオによっては Mongoid::Document と衝突する可能性があると思います。

于 2012-06-13T22:16:38.893 に答える