【问题标题】:Complex Model the Rails WayRails 方式的复杂模型
【发布时间】:2011-04-21 17:40:48
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案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
    

    这个想法是您从数据库中加载所有部分、问题和结果,而不是每个单独的实例。以同样的方式,您可以尝试使用joins 函数,看看它是否更适合您。

    检查开发环境中的日志或控制台以查看执行了哪些查询。

    【讨论】:

    • 很抱歉耽搁了测试这一点,但结果证明这是一种非常干净、干燥的方法。正是我想要的。谢谢!
    猜你喜欢
    • 2017-01-31
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多