Rails方式的复杂模型

时间:2011-04-21 05:48:32

标签: ruby-on-rails ruby activerecord

我正在网站上实施问卷调查。有多个问卷,每个都有部分,每个部分都有问题。用户可以填写零个或多个问卷。

下面的型号代码。 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

1 个答案:

答案 0 :(得分:1)

您的result(uq_id)方法有什么问题,它会查询数据库中的每个结果,这是缓慢且有限的资源。您可以做的是使用joinsincludes方法来优化您的数据库访问。所以在你的模型中:

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中检查日志或控制台以查看执行了哪些查询。