Mongoid har ikke has_many :through eller en tilsvarende funktion. Det ville ikke være så nyttigt med MongoDB, fordi det ikke understøtter joinforespørgsler, så selvom du kunne referere til en relateret samling via en anden, ville det stadig kræve flere forespørgsler.
https://github.com/mongoid/mongoid/issues/544
Normalt, hvis du har et mange-mange forhold i et RDBMS, ville du modellere det anderledes i MongoDB ved at bruge et felt, der indeholder en række 'fremmede' nøgler på begge sider. For eksempel:
class Physician
include Mongoid::Document
has_and_belongs_to_many :patients
end
class Patient
include Mongoid::Document
has_and_belongs_to_many :physicians
end
Med andre ord ville du eliminere join-tabellen, og den ville have en lignende effekt som has_many :through med hensyn til adgang til 'den anden side'. Men i dit tilfælde er det sandsynligvis ikke passende, fordi dit mødebord er en aftaleklasse, som indeholder nogle ekstra oplysninger, ikke kun foreningen.
Hvordan du modellerer dette afhænger til en vis grad af de forespørgsler, du skal køre, men det ser ud til, at du bliver nødt til at tilføje aftalemodellen og definere associationer til patient og læge noget som dette:
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
Med relationer i MongoDB skal du altid vælge mellem indlejrede eller tilknyttede dokumenter. I din model vil jeg gætte på, at MeetingNotes er en god kandidat til et indlejret forhold.
class Appointment
include Mongoid::Document
embeds_many :meeting_notes
end
class MeetingNote
include Mongoid::Document
embedded_in :appointment
end
Det betyder, at du kan hente notaterne sammen med en aftale samlet, mens du ville have brug for flere forespørgsler, hvis dette var en forening. Du skal bare huske størrelsesgrænsen på 16 MB for et enkelt dokument, som kan komme i spil, hvis du har et meget stort antal mødenotater.