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