Mongoid查询has_many

dbo*_*d68 4 ruby-on-rails mongodb mongoid

我有一个相当简单的mongodb模型目前2个系列学生课程(嵌入主题)

class Student < User
  include Mongoid::Document
  has_many :courses

class Course
  include Mongoid::Document
  belongs_to :student
  embeds_many :subjects
Run Code Online (Sandbox Code Playgroud)

我知道mongoid不支持直接查询has_many即

Student.courses
Run Code Online (Sandbox Code Playgroud)

因此,如果我想获得学生科目,这是唯一的方法

@student = Student.first
Course.find(@student.courses).subjects
Run Code Online (Sandbox Code Playgroud)

这目前有3个查询

  MOPED: 127.0.0.1:27017 QUERY        database=test collection=users selector=    {"$query"=>{"_type"=>{"$in"=>["Student"]}}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (1.1775ms)
  MOPED: 127.0.0.1:27017 QUERY        database=test collection=courses selector={"student_id"=>"51f09457b5b605db25000002"} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.8862ms)
  MOPED: 127.0.0.1:27017 QUERY        database=test collection=courses selector={"_id"=>"51f09457b5b605db25000003"} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.8380ms)
Run Code Online (Sandbox Code Playgroud)

有更有效的方法吗?我知道我可以在课程中嵌入课程,但我也会直接查询课程集.

San*_*osh 6

试试这个.

Subject.where(:course_id.in => @student.courses.map(&:id))
Run Code Online (Sandbox Code Playgroud)

  • Array#map是一种标准的Ruby方法,它迭代数组,将每个值传递给块,并将块的返回值收集到一个新数组中. (4认同)