【问题标题】:ActiveRecord Survey Model ActiveRecord Associations for Doctor -> PatientActiveRecord 调查模型 ActiveRecord 关联医生 -> 患者
【发布时间】:2015-05-29 18:59:21
【问题描述】:

我正在尝试构建一个调查表单,以便用户可以选择一个调查模板,然后将呈现一个包含特定于该模板的问题的表单。

class Survey < ActiveRecord::Base
  belongs_to :template
  belongs_to :patient
  has_many :questions, :through=> :template
  has_many :answers, :through=> :questions
end

class Template < ActiveRecord::Base
    has_many :surveys
    has_many :questions
end

class Question < ActiveRecord::Base
  belongs_to :template
  has_many :answers
end


class Answer < ActiveRecord::Base
  belongs_to :question
  belongs_to :survey
end

问题表有一个包含 30 个预置问题的列表,每个模板都有:

  create_table "questions", force: :cascade do |t|
    t.integer  "template_id"
    t.text     "content"
    t.string   "field_type"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.string   "category"
    t.string   "options"
    t.boolean  "additional"
  end

acl = Template.create(name:"ACL", body_part:"knee")
acl.questions.create(content:"Diagnosis", field_type:"text_area", category: "S")

我可以调用 Patient.surveys 来获取与患者相关的所有调查的列表。我可以致电 Patient.surveys.first.questions 以获取与给定调查相关的问题列表。

但我的困境是我无法弄清楚如何获得与特定调查的特定问题相关的答案。因为按照现在的设置,每个问题都有来自许多不同调查的多个答案。

理想情况下,我可以致电 Patient.surveys.first.questions.first.answer 以获得该问题的具体答案该调查

但是现在,我需要像 Patient.surveys.first.questions.first.answers.where(survey_id: Survey.first.id)

所以我的问题是:

我需要在我的关联中进行什么调整以便我可以调用:

Patient.surveys.first.questions.first.answer 以获得与问题和调查相关的正确答案?

【问题讨论】:

    标签: ruby-on-rails activerecord associations


    【解决方案1】:

    嗯,首先要注意的是,您正在执行多个查询,以获取实际上可以弹出到一个程序范围内的内容。我不知道你的需求是什么大局,所以我可能完全不知道什么对你来说更重要。

    要具体回答您的问题,您可以定义一个获取正确答案的方法。

    def answer
       survey=Survey.joins(:templates).where(:templates {id: self.template_id, question_id: self.id}).first
       Answer.where(:survey_id => survey.id).first
    end
    

    那就这样称呼吧

    patient.surveys.first.questions.first.answer

    您还可以通过将其弹出到您的答案模型中来进行范围界定以直接获得答案

    scope :for_survey_question, lambda {|survey, question| where(:survey_id => survey.id, :question_id => question.id).first }
    

    并在任何地方将其称为 Answer.for_survey_question(survey,question)(其中调查和问题都是调查和问题模型对象,分别作为参数加载和传入)

    【讨论】:

    • 太好了,我将从使用您的第一个建议开始。关于程序范围..我很新 - 我将不得不研究更多细节。你有什么推荐的教程或文章吗?谢谢!
    • 关于铁轨的美妙之处。您可以直接跳到主要来源,它们很好地填补了空白。 apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scope
    • 这个想法是,不是查询以查找患者,然后查询以查找调查,然后查询以查找问题,然后查询以查找答案...您将所有这些组合到一个查询中节省时间?
    • 其中一些与整洁、约定等有关。我发现有时开发人员甚至会受到性能的影响,只是为了让调用变得整洁(尽管从来没有大受欢迎)。在这种特定情况下,您只需调用一次调查、一次提问和一次回答。在另一种方法中,您调用了两次调查。这可以提高效率。这是一个很好的练习,可以了解如何塑造您的设计以使用范围和其他东西。
    • 现在我考虑了。您应该只调用 Survey.answer_to_question(q)。您可以按照我更改的方式进行大量连接,但您是否希望通过许多步骤来获得答案,或者这种行为是否严格地获得与特定调查有关的问题的答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多