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
Това означава, че можете да изтеглите бележките заедно със среща заедно, докато ще ви трябват множество заявки, ако това е асоциация. Просто трябва да имате предвид ограничението от 16 MB за един документ, което може да влезе в игра, ако имате много голям брой бележки за срещи.