说我正在为学生,课程和教师建模。考虑到一个学生参加了许多课程,我怎么能找到102级的所有班级老师?就此而言,我怎样才能找到他们所有的课程老师?现在,我有这个:
s = Mongoid::Student.find_by(name: 'Billy')
l = s.lessons.where(level: 102)
t = l.map { |lesson| lesson.teachers }.flatten
有没有办法将后两行转换成一个查询?
答案 0 :(得分:1)
每个集合至少需要一个查询,无法在一个查询中访问多个集合(即没有JOIN),因此这是您可以做的最好的。但是,这个:
t = l.map { |lesson| lesson.teachers }.flatten
正在进行l.length
次查询,以便每节课获得教师。您可以通过收集课程中的所有教师ID来清理它:
teacher_ids = l.map(&:teacher_ids).flatten.uniq # Or use `inject` or ...
然后根据这些ID抓住老师:
t = Teacher.find(teacher_ids)
# or
t = Teacher.where(:id.in => teacher_ids).to_a
如果所有这些查询都不适合您,那么您就会陷入非正规化的状态,这样您就可以将所有需要的内容嵌入到单个集合中;这当然意味着你必须在事情发生变化时保持副本,并定期检查副本是否存在一致性问题。