MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como implementar has_many :através de relacionamentos com Mongoid e mongodb?


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.