2015-05-29 4 views
1

Я пытаюсь создать форму опроса, чтобы Пользователь мог выбрать шаблон опроса, а затем форма будет отображаться с вопросами, специфичными для этого шаблона.ActiveRecord Survey Model ActiveRecord Associations for Doctor -> Пациент

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, чтобы получить правильный ответ, связанный с BOTH вопросом и опросом?

ответ

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 (опрос, вопрос) (где опрос и вопрос - это как объекты опроса, так и объекты-объекты, загруженные и переданные в качестве параметра соответственно)

+0

Отлично, я начну с использования вашего первого предложения. Что касается процедурных областей. Я довольно новый - мне придется подробнее изучить это. Любые учебные пособия или статьи, которые вы рекомендуете? Благодаря! –

+1

прекрасный предмет примерно рельсы. Вы можете прыгать прямо к основным источникам, и они заполняют пробелы довольно красиво. http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scope – OscillatingMonkey

+0

И идея состоит в том, что вместо запроса на поиск Пациентов, затем запрос на поиск Surveys, затем запрос на поиск вопросов, затем запрос на поиск ответов ... Вы объединяете все это в один запрос, чтобы сэкономить время? –

Смежные вопросы