rails 3.1, how to calculate answers number using foreign key?

谁都会走 提交于 2019-12-25 04:44:11

问题


I have the following tables:

class FinalExam < ActiveRecord::Base
  belongs_to :course
  has_many :pages, :as => :course_unit, :dependent => :destroy
end

class Page < ActiveRecord::Base
  belongs_to :course_unit, :polymorphic => true
  has_one :quiz
  has_one :slide
end

class Quiz < ActiveRecord::Base
  belongs_to :page
end

class Answers < ActiveRecord::Base
  belongs_to :quiz
end

So, we have Answer.Quiz.Page.FinalExam

Given the FianlExam id, what is the fastest way to find all Answers count ? how to get it ?

I can re-design the DB to have belongs_to :final_exam in Answers

class Answers < ActiveRecord::Base
  belongs_to :quiz
  belongs_to :final_exam
end

this way, I can say Answers.where(:final_exam_id=> params[:id]).count

Do I have to change the DB design ? or its a matter of a query ?

I need an expert advice please.


回答1:


First of all I'm guessing that Quiz should read:

class Quiz < ActiveRecord::Base
  belongs_to :page
  has_many :answers
end

If so you can add these lines to your FinalExam model:

has_many :quizzes, :through => :pages
has_many :answers, :through => :quizzes

Allowing you to then call

FinalExam.first.answer.count

(Note: if you're on a version of Rails < 3.1, you'll need this plugin)

The drawback to this approach is that it becomes slow with a lot of data. In this case, you'd want to set up a counter cache in the FinalExam that updates every time an answer is added. It'd a little more complicated because of the many-layered relationships you have; see this post for more info:

counter_cache has_many_through sql optimisation, reduce number of sql queries



来源:https://stackoverflow.com/questions/8102682/rails-3-1-how-to-calculate-answers-number-using-foreign-key

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!