ActiveRecord调查模型医生的ActiveRecord关联 - >患者

时间:2015-05-29 18:59:22

标签: ruby-on-rails activerecord associations

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

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获得与问题和调查相关的正确答案?

1 个答案:

答案 0 :(得分: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(调查,问题)(调查和问题都是调查和问题模型对象,分别作为参数加载和传递)