Mongoid:返回与关系相关的文件?

时间:2015-01-10 21:35:24

标签: ruby-on-rails ruby mongodb mongoid

说我正在为学生,课程和教师建模。考虑到一个学生参加了许多课程,我怎么能找到102级的所有班级老师?就此而言,我怎样才能找到他们所有的课程老师?现在,我有这个:

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

有没有办法将后两行转换成一个查询?

1 个答案:

答案 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

如果所有这些查询都不适合您,那么您就会陷入非正规化的状态,这样您就可以将所有需要的内容嵌入到单个集合中;这当然意味着你必须在事情发生变化时保持副本,并定期检查副本是否存在一致性问题。