Комплексная модель рельсового пути - PullRequest
2 голосов
/ 21 апреля 2011

Я использую анкеты на сайте.Есть несколько анкет, у каждого есть разделы, у каждого раздела есть вопросы.Пользователи могут заполнить ноль или много анкет.

код модели ниже.ERD-изображение http://i.stack.imgur.com/6Y0r3.png

Каким будет «путь Rails» для хранения / отображения результатов вопросов при сохранении иерархии разделов в представлении?Я не против написания кода, но не был уверен, что упустил что-то очевидное.Я начал с методов в модели вопросов, но она не использует преимущества помощников по форме и тому подобное.

#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

1 Ответ

1 голос
/ 21 апреля 2011

Что не так с вашим методом result(uq_id), так это то, что он будет запрашивать БД для каждого результата, что является медленным и постоянным ресурсом.То, что вы могли бы сделать, это использовать joins или includes методы для оптимизации доступа к БД.Итак, в вашей модели:

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 и посмотреть, подходит ли она вам.

Проверьте журналы или консоль в dev env, чтобы увидеть, какие запросы выполняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...