Mongoid nie ma has_many :through ani równoważnej funkcji. Nie byłoby to tak przydatne w przypadku MongoDB, ponieważ nie obsługuje zapytań łączących, więc nawet jeśli możesz odwoływać się do powiązanej kolekcji za pośrednictwem innej, nadal wymagałoby to wielu zapytań.
https://github.com/mongoid/mongoid/issues/544
Normalnie, jeśli masz relację wiele-wiele w RDBMS, modelujesz to inaczej w MongoDB, używając pola zawierającego tablicę „obcych” kluczy po obu stronach. Na przykład:
class Physician
include Mongoid::Document
has_and_belongs_to_many :patients
end
class Patient
include Mongoid::Document
has_and_belongs_to_many :physicians
end
Innymi słowy, wyeliminowałbyś tabelę złączeń i miałby podobny efekt do has_many :through pod względem dostępu do 'drugiej strony'. Ale w twoim przypadku jest to prawdopodobnie nieodpowiednie, ponieważ twoja tabela łączenia jest klasą Appointment, która zawiera dodatkowe informacje, a nie tylko powiązanie.
Sposób modelowania zależy w pewnym stopniu od zapytań, które musisz uruchomić, ale wydaje się, że będziesz musiał dodać model Spotkania i zdefiniować powiązania z Pacjentem i Lekarzem w następujący sposób:
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
W przypadku relacji w MongoDB zawsze musisz dokonać wyboru między dokumentami osadzonymi lub powiązanymi. W twoim modelu zgadywałbym, że MeetingNotes jest dobrym kandydatem do osadzonej relacji.
class Appointment
include Mongoid::Document
embeds_many :meeting_notes
end
class MeetingNote
include Mongoid::Document
embedded_in :appointment
end
Oznacza to, że możesz pobrać notatki razem ze spotkaniem, podczas gdy potrzebujesz wielu zapytań, jeśli jest to powiązanie. Musisz tylko pamiętać o limicie rozmiaru 16 MB dla pojedynczego dokumentu, który może mieć zastosowanie, jeśli masz bardzo dużą liczbę notatek ze spotkań.