2015-01-01 3 views
2

Я использую: через отношения между двумя моделями, потому что у меня есть дополнительные данные, которые я хочу сохранить в таблице соединений, иначе я бы просто использовал соотношение: source.Как хранить связанные данные модели с помощью модели в Rails

Но данные, которые я хочу сохранить, являются динамическими - это список вопросов, которые были добавлены в экземпляр одной из моделей, с которыми я соединяюсь. Пример:

Врачи добавляют уникальные вопросы, на которые пациенты должны отвечать при назначении на прием - д-р Фу хочет, чтобы его пациенты ответили «высота» и «вес», в то время как д-р Бар хочет, чтобы его патенты отвечали «возраст» и « Пол'.

Каков самый чистый способ хранения ответов на эти вопросы в экземпляре модели Appointment?

текущие модели:

class Question < ActiveRecord::Base 
    belongs_to :physician 
end 

class Physician < ActiveRecord::Base 
    has_many :questions 
    has_many :appointments 
    has_many :patients, through: :appointments 
end 

class Appointment < ActiveRecord::Base 
    belongs_to :physician 
    belongs_to :patient 
end 

class Patient < ActiveRecord::Base 
    has_many :appointments 
    has_many :physicians, through: :appointments 
end 

Заранее спасибо - я пришел через это несколько раз, и хотелось бы услышать хороший ответ на это - еще один пример: Пользователь принимает викторину. Quiz has_many Вопросы.
Как вы могли бы сохранить уникальные ответы на статический набор вопросов, которые есть у каждой викторины? Опять же, я застрял в использовании отношения: через отношения, используя таблицу соединений, называемую «Попытки».

Возможное решение, о котором я думал: Пациент has_many Surveys and Survey has_many Answers. Создайте это, когда будет создано новое Назначение. Проблема в том, что я считаю, что представления и контроллеры являются довольно сложными для чего-то столь же простого, как, например, для повторения моего вопроса, хранения данных, связанных с таблицей соединения.

ответ

2

Я бы рекомендовал добавить новую модель под названием Answer для хранения этой информации. Что-то вроде

class Answer < ActiveRecord::Base 
    belongs_to: appointment 
    belongs_to: patient 
end 

Отношения с Question модели может быть трудно поддерживать. Подумайте о вопросе, который уже был рассмотрен и изменил его текст из «сколько вам лет»? к «когда вы родились?». Вы должны будете предотвратить это изменение в модели вопроса или сохранить текст вопроса с ответом и забыли отношения.

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

class Appointment < ActiveRecord::Base 
    belongs_to :physician 
    belongs_to :patient 

    serialize :answers 
end 

Вам нужно добавить текстовый атрибут в таблице назначения называется answers

Ответы атрибута будет хэш, где вы можете сохранить что-то вроде {question_text_1: answer_1, question_text_2: answer_2}. Это позволит вам легко использовать его в представлении.

Также легко написать способ сохранения/обновления этого атрибута, который позволяет легко сформировать соответствующий вид.

Опять же, необходимо определить, что произойдет со старыми встречами, когда врач изменяет названия вопросов.

+0

Как насчет добавления belongs_to вопрос тоже в модели ответа. а затем пожарный запрос patient.answers.where (question_id in (physician.questions.pluck (: id) и destination_id = назначениеId) ... Предложение сериализации более холодное, чем я чувствую. Было бы дешевле при запуске запроса и общей сложности – jaspreet21anand

+0

вопрос и ответные отношения понятны, но слишком академичны: что происходит, если вы хотите изменить текст вопроса, но у него есть несколько ответов, уже связанных? Если вы аннулируете старые ответы или предотвращаете редактирование вопросов? Что касается сериализации, это мой предпочтительный вариант, t требует слишком много логики, например, как проверка ответа или сложные обратные вызовы – fjuan

0

Мне кажется, вам нужны еще две дополнительные таблицы: Ответ и НазначениеQuestion. Существует сложная проблема questions_to_ask, вопросов и ответов. Я обратился к вопросам questions_to_ask, делегируя от назначения к врачу, давая Appointment.physician_questions.Идея заключается в том, что назначение будет знать, какие вопросы задавать, и будет хранить ответы на вопросы

Я получил это решение, построив диаграммы отношений entiry, а затем посмотрев на создание промежуточного объекта, где существуют отношения m-m. Нижеприведенный материал не является полным.

Это предполагает общее решение иметь таблицу, содержащую строку каждый раз вопрос задан (возможно, переименовать AppointmentQuestion в AskedQuestion)

AppointmentQuestion 
    belongs_to :question 
    belongs_to :appointemnt 
    has_one :answer 

Answer 
    belongs_to :AppointmentQuestion 

Appointment 
    belongs_to :physician 
    belongs_to :patient 
    has_many questions through appointment_question 
    has_many answers through appointment_question 
    delegate :questions, to: :doctor, prefix: true 

Patient 
    has_many appointments 

Physician 
    has_many appointments 
    has_many questions 

Question 
    belongs_to physician 
    has_may answers through appointment_question 
0

Я не знаю, какую базу данных вы используете, но и мне кажется, что это прекрасный пример использования Postgres HStore. Учитывая, что ваши данные динамичны, неструктурированы.

http://www.postgresql.org/docs/9.1/static/hstore.html

Вы могли бы иметь поля вопросы типа hstore

с назначением миграции

def change 
    create_table :named_searches do |t| 
    t.hstore questions 
    end 
end 

И вы бы это поле имеющихся на вашей модели (она работает как хэш с парами значений ключей, вопросами и ответами в вашем случае)

Когда вы запрашиваете вопросы в этом случае, вы получите список вопросов с их соответствующими ответами, и хотя список является динамическим (любой вопрос может быть добавлен/встречи не должны иметь одинаковые вопросы), его можно легко сохранить в базе данных

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