Mongoid heeft geen has_many :through of een gelijkwaardige functie. Het zou niet zo handig zijn met MongoDB omdat het geen join-query's ondersteunt, dus zelfs als u via een andere naar een gerelateerde verzameling zou kunnen verwijzen, zou er nog steeds meerdere query's nodig zijn.
https://github.com/mongoid/mongoid/issues/544
Normaal gesproken, als je een veel-veel-relatie hebt in een RDBMS, zou je dat in MongoDB anders modelleren met behulp van een veld met aan weerszijden een reeks 'buitenlandse' sleutels. Bijvoorbeeld:
class Physician
include Mongoid::Document
has_and_belongs_to_many :patients
end
class Patient
include Mongoid::Document
has_and_belongs_to_many :physicians
end
Met andere woorden, je zou de join-tabel elimineren en het zou een soortgelijk effect hebben als has_many :through in termen van toegang tot de 'andere kant'. Maar in jouw geval is dat waarschijnlijk niet gepast, omdat je join-tabel een afspraakklasse is die wat extra informatie bevat, niet alleen de associatie.
Hoe u dit modelleert, hangt tot op zekere hoogte af van de query's die u moet uitvoeren, maar het lijkt erop dat u het afspraakmodel moet toevoegen en associaties met patiënt en arts moet definiëren, zoiets als dit:
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
Bij relaties in MongoDB moet je altijd een keuze maken tussen embedded of bijbehorende documenten. In uw model vermoed ik dat MeetingNotes een goede kandidaat is voor een ingebedde relatie.
class Appointment
include Mongoid::Document
embeds_many :meeting_notes
end
class MeetingNote
include Mongoid::Document
embedded_in :appointment
end
Dit betekent dat u de notities samen met een afspraak allemaal tegelijk kunt ophalen, terwijl u meerdere vragen zou hebben als dit een associatie was. U hoeft alleen maar rekening te houden met de limiet van 16 MB voor een enkel document, die een rol kan spelen als u een zeer groot aantal vergadernotities heeft.