Объединение двух наборов запросов - Ruby on Rails с MongoDB

У меня есть две разные модели: CoachTrainingSession и OrganizationTrainingSession, у которых есть общее поле: client_id.

coach_training_session.rb

class CoachTrainingSession
  include Mongoid::Document
  include Mongoid::Timestamps

  belongs_to :coach

  field :session_id      #firebase ID
  field :date_time, type: DateTime
  field :completed, type: Boolean, default: false
  field :cancelled, type: Boolean, default: false
  field :client_ids, type: Array
  field :group_name

  index({client_id: 1})
  index({session_id: 1})
  index({date_time: 1})
  index({client_ids: 1})
  index({group_name: 1})

  has_many :booked_sessions
end

organization_training_session.rb

class OrganizationTrainingSession
  include Mongoid::Document
  include Mongoid::Timestamps

  belongs_to :organization

  field :session_id  # firebase schedule id 
  field :date_time,  type: DateTime
  field :completed,  type: Boolean, default: false
  field :cancelled,  type: Boolean, default: false
  field :client_ids, type: Array
  field :coach_ids,  type: Array
  field :group_name
  field :recurring_sessions_id

  index({client_id: 1})
  index({session_id: 1})
  index({date_time: 1})
  index({client_ids: 1})
  index({completed: 1})
  index({cancelled: 1})
  index({group_name: 1})
  index({coach_ids: 1})
end

Когда я объединяю результаты с помощью +, результатом является массив. Но мне нужен набор запросов, чтобы я мог выполнять разбиение на страницы на уровне самой БД.

organization_sessions = OrganizationTrainingSession.where(:client_ids => "58358494767f430fc4154fe8")

coach_sessions = CoachTrainingSession.where(:client_ids => "58358494767f430fc4154fe8")

Мне нужен набор запросов, который представляет собой объединение organization_sessions и coach_sessions.

Любая помощь была бы замечательной!

Они действительно должны быть в одной коллекции. Фактически у вас могут быть документы с разными структурами в коллекции, и Mongoid поддерживает сопоставление различных классов. Дело в том, что это единственное практическое решение. В MongoDB не существует такой вещи, как запрос UNION, и единственный другой способ объединения наборов результатов - «внешний». Таким образом, объединение всего этого в одну коллекцию дает вам наиболее масштабируемое решение.

Neil Lunn 18.05.2018 13:03

Да, я понимаю предложенное вами решение. Эти модели созданы кем-то другим. Эта система уже разработана и в БД уже есть огромный набор данных. Так что я не думаю, что смогу легко обновить коллекции. Не могли бы вы объяснить больше о «внешнем»?

Tessy Thomas 18.05.2018 13:16

Так же все результаты возвращаем в массивы и «комбинируем в коде». Просто не существует варианта запроса на объединение, и я бы сказал «не будет», но шесть лет назад никогда не было ни объединений, ни транзакций. Кто знал? Но для этого нет возможности «запросить». Лучше исправить код и получить такую ​​полиморфную модель, о которой я говорю. Иногда плохой дизайн нужно просто отбросить и начать заново, и, поскольку это нарушает базовое правило «одна коллекция на запрос», его следует отбросить.

Neil Lunn 18.05.2018 13:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
37
0

Другие вопросы по теме