2014-10-28 20 views
0

我在我的Rails應用這些模型:最佳方式

class Course < ActiveRecord::Base 
    has_many :topics 
end 

class Topic < ActiveRecord::Base 
    has_many :parts 
    belongs_to :course 
end 

class Part < ActiveRecord::Base 
    has_many :quizzes 
    belongs_to :topic 
end 

class Quiz < ActiveRecord::Base 
    has_many :quiz_submissions 
    belongs_to :part 
end 

class QuizSubmission < ActiveRecord::Base 
    belongs_to :quiz 
end 

現在我想所有QuizSubmissions'課程ID,即quiz_submission.quiz.part.topic.course.id每個quiz_submission。

我目前的代碼是QuizSubmission.all.map{|qs| qs.quiz.part.topic.cours.id}這是非常慢,我也試過joins,仍然沒有提高性能。也許我錯誤地使用了joins

有什麼建議嗎?我應該讓QuizSubmission belongs_to :course?謝謝!

+0

你可以做'QuizSubmission belongs_to的:course' *如果*測驗提交有一個'course_id'。你可以展示你爲'join'案件嘗試的嗎? – lurker 2014-10-28 10:25:11

+0

你希望你的桌子有多少行?你是否想過對桌子進行去規範化? – spickermann 2014-10-28 10:32:50

+0

嘗試:'QuizSubmission.joins(:測驗=> {:part => {:topic =>:course}})。select('courses.id')' – Surya 2014-10-28 11:54:55

回答

1

你可以這樣做:

QuizSubmission.joins(:quiz => {:part => {:topic => :course}}). 
       select('quiz_submissions.id, courses.id as course_id') 
0

您可以嘗試

Course.joins({ topics: { parts: { quizzes: :quiz_submissions } } }).map(&:id) 
+0

我認爲這是另一種方式,User089247的答案有幫助。 – Zeyu 2014-10-28 18:34:05

0

如果我理解正確的問題,那就是如何讓IDS快速不加入。

quiz_subm_ids = QuizSubmission.pluck(:id) 
part_ids = Part.where(quiz_submission_id: quiz_subm_ids).pluck(:id) 
topic_ids = Topic.where(part_id: part_ids).pluck(:id) 
course_ids = Topic.where(topic_id: topic_ids).pluck(:id) 
+0

謝謝!我不想在沒有加入的情況下做到這一點,我只是想找到一個合適的方式來做到這一點。 – Zeyu 2014-10-28 18:33:01