如何在Rails中通过模型存储相关的模型数据

时间:2015-01-01 04:33:04

标签: ruby-on-rails

我使用的是:通过2个模型之间的关系,因为我想在连接表中存储额外的数据 - 否则我只会使用:source关系。

但是我要存储的数据是动态的 - 它是已添加到我加入的其中一个模型的实例中的问题列表。例如:

医生在预约时会提出患者应该回答的独特问题--Foo医生希望他的患者回答“身高”和“体重”,而Bar博士希望他的专利能够回答“年龄”和“性别”。

在约会模型实例中存储这些问题的答案的最简洁方法是什么?

当前型号:

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

提前致谢 - 我已经多次遇到这个问题并希望听到一个很好的答案 - 另一个例子是:用户参加测验。测验有很多问题 您如何将每个测验所具有的静态问题集的唯一答案存储起来?同样,我坚持使用一个名为Attempts的连接表来使用:through关系。

我想到的可能的解决方案:患者has_many调查和调查has_many答案。在创建新约会时创建此选项。问题是,我发现视图和控制器非常复杂,只需重述我的问题,存储与连接表相关的数据。

3 个答案:

答案 0 :(得分:2)

我建议添加一个名为Answer的新模型来存储此信息。像

这样的东西
class Answer < ActiveRecord::Base
  belongs_to: appointment
  belongs_to: patient
end

Question模型的关系可能难以维持。想想一个已经回答的问题,并改变其文字的年龄,你的年龄是多少?&#39;你是什​​么时候出生的?&#39;。您必须在问题模型中阻止此更改,或将问题文本与答案一起存储,并忘记关系。

另一种选择是在约会模型上使用序列化的属性来存储其问题和答案。

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

  serialize :answers
end

您需要在名为answers

的约会表中添加文本属性

answers属性将是一个散列,您可以在其中保存{question_text_1: answer_1, question_text_2: answer_2}之类的内容。这样您就可以在视图中轻松使用它。

编写保存/更新此属性的方法也很容易,可以在相应的视图中使用简单的表单。

同样,当医生更换问题标题时,需要定义旧约会会发生什么。

答案 1 :(得分:0)

我认为你需要两个额外的表:答案和AppointmentQuestion。 question_to_ask,questions_answered和答案都有棘手的问题。我通过委托给医生,给了Appointment.physician_questions来解决questions_to_ask问题。想法是约会将知道要问什么问题,并将存储回答的问题

通过绘制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

答案 2 :(得分: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

你可以在你的模型上使用该字段(它就像一个带有键值对的散列,在你的情况下有问题和答案)

当您查询有关该案例的问题时,您将获得一系列问题及其各自的答案,虽然该列表是动态的(可以添加任何问题/约会不需要具有相同的问题),它可以无缝地保存到数据库中