Mongoidには、has_many:throughまたは同等の機能はありません。結合クエリをサポートしていないため、MongoDBではあまり役に立ちません。そのため、別のコレクションを介して関連するコレクションを参照できたとしても、複数のクエリが必要になります。
https://github.com/mongoid/mongoid/issues/544
通常、RDBMSに多対多の関係がある場合は、MongoDBで、両側に「外部」キーの配列を含むフィールドを使用して、別の方法でモデル化します。例:
class Physician
include Mongoid::Document
has_and_belongs_to_many :patients
end
class Patient
include Mongoid::Document
has_and_belongs_to_many :physicians
end
言い換えると、結合テーブルを削除すると、「反対側」へのアクセスに関して、has_many:throughと同様の効果があります。ただし、あなたの場合、結合テーブルは、関連付けだけでなく、いくつかの追加情報を運ぶAppointmentクラスであるため、おそらく適切ではありません。
これをどのようにモデル化するかは、実行する必要のあるクエリにある程度依存しますが、予定モデルを追加し、患者と医師への関連付けを次のように定義する必要があるようです。
class Physician
include Mongoid::Document
has_many :appointments
end
class Appointment
include Mongoid::Document
belongs_to :physician
belongs_to :patient
end
class Patient
include Mongoid::Document
has_many :appointments
end
MongoDBのリレーションシップでは、埋め込みドキュメントと関連付けられたドキュメントのどちらかを常に選択する必要があります。あなたのモデルでは、MeetingNotesは埋め込まれた関係の良い候補だと思います。
class Appointment
include Mongoid::Document
embeds_many :meeting_notes
end
class MeetingNote
include Mongoid::Document
embedded_in :appointment
end
これは、予定と一緒にメモをまとめて取得できることを意味しますが、これが関連付けである場合は複数のクエリが必要になります。非常に多くの会議メモがある場合に機能する可能性がある単一のドキュメントの16MBのサイズ制限に注意する必要があります。