我正在网站上实施问卷调查。有多个问卷,每个都有部分,每个部分都有问题。用户可以填写零个或多个问卷。
下面的型号代码。 ERD图像http://i.stack.imgur.com/6Y0r3.png
在视图中维护部分层次结构时,存储/显示问题结果的“Rails方式”是什么?我不介意编写代码,但不确定我是否遗漏了一些明显的东西。我已经开始使用Question模型中的方法,但它没有利用Form Helpers等。
#Simplistic view code
%h1= @user_questionnaire.questionnaire.value
- for section in @user_questionnaire.questionnaire.sections
%h4=section.value
%br
- for question in section.questions
=question.value
=question.result(@user_questionnaire.id)
欢迎任何想法。谢谢! 唐纳德
型号代码
class Questionnaire < ActiveRecord::Base
has_many :sections
has_many :user_questionnaires
end
class Section < ActiveRecord::Base
belongs_to :questionnaire
has_many :questions
end
class Question < ActiveRecord::Base
belongs_to :section
has_many :user_questionnaire_results
def result(uq_id)
uqr = UserQuestionnaireResult.where(:question_id => self.id, :user_questionnaire_id => uq_id).first
uqr.result
end
end
class UserQuestionnaire < ActiveRecord::Base
belongs_to :questionnaire
has_many :user_questionnaire_results
belongs_to :user
end
class UserQuestionnaireResult < ActiveRecord::Base
belongs_to :user_questionnaire
belongs_to :question
end
答案 0 :(得分:1)
您的result(uq_id)
方法有什么问题,它会查询数据库中的每个结果,这是缓慢且有限的资源。您可以做的是使用joins
或includes
方法来优化您的数据库访问。所以在你的模型中:
class UserQuestionnaire
def self.includes_questions
includes :questionnaire => {:sections => [:questions]}
end
def loaded_result question
user_questionnaire_results.to_a.find { |r| r.question_id == question.id }
end
end
然后在控制器中:
@user_questionnaire = UserQuestionnaire.includes_questions.find params[:id]
在视野中而不是=question.result(@user_questionnaire.id)
使用:
= @user_questionnaire.loaded_result question
这个想法是你从DB加载所有部分,问题和结果togather,而不是每个单独的实例。以同样的方式,您可以尝试使用joins
功能,看看它是否适合您。
在dev env中检查日志或控制台以查看执行了哪些查询。