2013-07-25 66 views
3

我有一個非常簡單的MongoDB模型 目前2集 學生 課程(嵌入對象)Mongoid查詢的has_many

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

class Course 
    include Mongoid::Document 
    belongs_to :student 
    embeds_many :subjects 

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

Student.courses 

所以,如果我想獲得一個學生的科目是唯一的方式

@student = Student.first 
Course.find(@student.courses).subjects 

這目前並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) 

有沒有更有效的方法? 我知道我可以在課程中嵌入課程,但我也在直接查詢課程集合。

回答

6

試試這個。

Subject.where(:course_id.in => @student.courses.map(&:id)) 
+0

這樣更好。試圖找到關於.map函數()的文檔知道它在哪裏? – dboyd68

+0

從查詢的角度來看,使用@ student.courses和@ student.courses.map(&:id))似乎沒有任何區別?是否 – dboyd68

+4

Array#map是一種標準的Ruby方法,它遍歷數組,將每個值傳遞給塊,並將塊的返回值收集到一個新數組中。 –