gpt4 book ai didi

ruby-on-rails - Rails 方式的复杂模型

转载 作者:太空宇宙 更新时间:2023-11-03 16:37:25 25 4
gpt4 key购买 nike

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

模型代码如下。 ERD图像http://i.stack.imgur.com/6Y0r3.png

在 View 中维护部分层次结构的同时存储/显示问题结果的“Rails Way”是什么?我不介意编写代码,但不确定我是否遗漏了一些明显的东西。我从问题模型中的方法开始,但它没有利用表单助手等。

#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

最佳答案

您的 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

然后在 Controller 中:

@user_questionnaire = UserQuestionnaire.includes_questions.find params[:id]

并在 View 中代替 =question.result(@user_questionnaire.id) 使用:

= @user_questionnaire.loaded_result question

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

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

关于ruby-on-rails - Rails 方式的复杂模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5740078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com