最佳方式
我在我的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
?谢谢!
你可以这样做:
QuizSubmission.joins(:quiz => {:part => {:topic => :course}}).
select('quiz_submissions.id, courses.id as course_id')
您可以尝试
Course.joins({ topics: { parts: { quizzes: :quiz_submissions } } }).map(&:id)
我认为这是另一种方式,User089247的答案有帮助。 – Zeyu 2014-10-28 18:34:05
如果我理解正确的问题,那就是如何让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)
谢谢!我不想在没有加入的情况下做到这一点,我只是想找到一个合适的方式来做到这一点。 – Zeyu 2014-10-28 18:33:01
你可以做'QuizSubmission belongs_to的:course' *如果*测验提交有一个'course_id'。你可以展示你为'join'案件尝试的吗? – lurker 2014-10-28 10:25:11
你希望你的桌子有多少行?你是否想过对桌子进行去规范化? – spickermann 2014-10-28 10:32:50
尝试:'QuizSubmission.joins(:测验=> {:part => {:topic =>:course}})。select('courses.id')' – Surya 2014-10-28 11:54:55