У меня есть две разные модели: 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, и единственный другой способ объединения наборов результатов - «внешний». Таким образом, объединение всего этого в одну коллекцию дает вам наиболее масштабируемое решение.