Mongoid não tem has_many :through ou um recurso equivalente. Não seria tão útil com o MongoDB porque ele não suporta consultas de junção, portanto, mesmo que você pudesse fazer referência a uma coleção relacionada por meio de outra, ainda exigiria várias consultas.
https://github.com/mongoid/mongoid/issues/544
Normalmente, se você tiver um relacionamento muitos-muitos em um RDBMS, você modelaria isso de maneira diferente no MongoDB usando um campo contendo uma matriz de chaves 'estrangeiras' em ambos os lados. Por exemplo:
class Physician
include Mongoid::Document
has_and_belongs_to_many :patients
end
class Patient
include Mongoid::Document
has_and_belongs_to_many :physicians
end
Em outras palavras, você eliminaria a tabela de junção e teria um efeito semelhante ao has_many :through em termos de acesso ao 'outro lado'. Mas no seu caso isso provavelmente não é apropriado porque sua tabela de junção é uma classe de compromisso que carrega algumas informações extras, não apenas a associação.
Como você modela isso depende até certo ponto das consultas que você precisa executar, mas parece que você precisará adicionar o modelo Compromisso e definir associações para Paciente e Médico algo assim:
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
Com relacionamentos no MongoDB, você sempre precisa escolher entre documentos incorporados ou associados. Em seu modelo, eu diria que o MeetingNotes é um bom candidato para um relacionamento incorporado.
class Appointment
include Mongoid::Document
embeds_many :meeting_notes
end
class MeetingNote
include Mongoid::Document
embedded_in :appointment
end
Isso significa que você pode recuperar as notas junto com um compromisso, enquanto você precisaria de várias consultas se isso fosse uma associação. Você só precisa ter em mente o limite de tamanho de 16 MB para um único documento que pode entrar em jogo se você tiver um número muito grande de notas de reunião.