Ruby on rails 如何在Rails中通过模型存储相关模型数据

Ruby on rails 如何在Rails中通过模型存储相关模型数据,ruby-on-rails,Ruby On Rails,我在两个模型之间使用:through关系,因为我有额外的数据要存储在联接表中——否则我只使用:source关系 但我要存储的数据是动态的——它是一个问题列表,已经添加到我要加入的模型之一的实例中。例如: 医生增加了病人在预约时应该回答的独特问题——傅博士希望他的病人回答“身高”和“体重”,而巴尔博士希望他的专利回答“年龄”和“性别” 在约会模型实例中存储这些问题的答案最干净的方法是什么 当前型号: class Question < ActiveRecord::Base belongs_

我在两个模型之间使用:through关系,因为我有额外的数据要存储在联接表中——否则我只使用:source关系

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

医生增加了病人在预约时应该回答的独特问题——傅博士希望他的病人回答“身高”和“体重”,而巴尔博士希望他的专利回答“年龄”和“性别”

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

当前型号:

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
类问题
提前感谢——我已经遇到过好几次了,希望听到一个好的答案——另一个例子是:用户进行测验。测验有很多问题。
您将如何存储每个测验的静态问题集的唯一答案?同样,我一直在使用一个名为“尝试”的联接表来使用:through关系


我想到的可能解决方案是:患者有很多调查,调查有很多答案。在进行新约会时创建此项。问题是,我发现视图和控制器非常复杂,因为要重申我的问题,存储与联接表相关的数据非常简单。

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

class Answer < ActiveRecord::Base
  belongs_to: appointment
  belongs_to: patient
end
您需要向名为
answers

answers属性将是一个散列,您可以在其中保存类似
{question\u text\u 1:answer\u 1,question\u text\u 2:answer\u 2}
。这将允许您在视图上轻松使用它

编写保存/更新此属性的方法也很容易,这样可以在相应的视图上创建一个简单的表单


同样,有必要定义当医生更改问题标题时,旧预约会发生什么情况。

我认为这里需要两个额外的表格:答案和预约问题。还有一个棘手的问题,就是你要问的问题,你要回答的问题和答案。我已经通过将预约委托给医生,给予预约,解决了您提出的问题。医生问题。这样的想法是,约会将知道要问什么问题,并将存储已回答的问题

我通过绘制实体关系图,然后考虑在存在m-m关系的地方创建中间对象,得到了这个解决方案。下面的内容不完整

这建议了一种通用解决方案,即每次询问问题时都有一个包含一行的表(可能将AppointmentQuestion重命名为AskedQuestion)


我不知道你在使用哪个数据库,但对我来说,这似乎是使用Postgres HStore的完美例子。考虑到您的数据是动态的、非结构化的

您可以有一个hstore类型的字段问题

在你的约会上

def change
  create_table :named_searches do |t|
    t.hstore questions
  end
end
您的模型上也会有该字段(它的工作方式类似于一个散列,在您的案例中包含键值对、问题和答案)


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

在回答模型中添加属于问题如何。然后激发查询patient.answers.where(在(内科医生.questions.pull(:id)中的问题\u id)和预约\u id=预约id)…我觉得序列化建议更酷。在查询启动和总体复杂性方面成本更低问答关系清晰但过于学术化:如果您想更改一个问题文本,但它已经链接了多个答案,会发生什么情况?您是否应该使旧答案无效或防止编辑问题?关于序列化,它只要它不需要太多逻辑(如答案验证或复杂回调),这是我的首选选项
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
def change
  create_table :named_searches do |t|
    t.hstore questions
  end
end