2015-01-10 2 views
0

Скажем, я моделирую студентов, уроков и учителей. Учитывая, что один студент, обучающийся на многих уроках, мог бы найти всех своих учителей классов, которые являются уровнем 102? В этом отношении, как бы я нашел всех учителей своих уроков? Прямо сейчас у меня есть это:Mongoid: вернуть документы, связанные с отношением?

s = Mongoid::Student.find_by(name: 'Billy') 
l = s.lessons.where(level: 102) 
t = l.map { |lesson| lesson.teachers }.flatten 

Есть ли способ сделать две строки в одном запросе?

+0

Это отдельная коллекция. – subvertallchris

+0

Отлично, это именно то, что я искал. Все они являются отдельными коллекциями, используя 'belongs_to_and_has_many'. Отправьте это как ответ, и я могу принять! – subvertallchris

ответ

1

Для каждой коллекции требуется хотя бы один запрос, нет доступа к нескольким коллекциям в одном запросе (т. Е. Нет JOIN), так что это лучшее, что вы можете сделать. Тем не менее, это:

t = l.map { |lesson| lesson.teachers }.flatten 

делает l.length запросы, чтобы получить учитель за урок. Вы можете очистить, что до, собирая все идентификаторы учителей из уроков:

teacher_ids = l.map(&:teacher_ids).flatten.uniq # Or use `inject` or ... 

, а затем захватить учителей на основе этих идентификаторов:

t = Teacher.find(teacher_ids) 
# or 
t = Teacher.where(:id.in => teacher_ids).to_a 

Если все эти запросы не работают для вас, то вы застряли с денормализацией чего-то, чтобы у вас было все, что вам нужно, встроенное в одну коллекцию; это, конечно, означало бы, что вам придется хранить копии, когда все меняется, и периодически проверяют копии на проблемы согласованности.

+0

Спасибо, это именно то, что я пытался найти. Я надеялся, что будет нечто вроде:. – subvertallchris

Смежные вопросы