我使用的是:通过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答案。在创建新约会时创建此选项。问题是,我发现视图和控制器非常复杂,只需重述我的问题,存储与连接表相关的数据。
答案 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
你可以在你的模型上使用该字段(它就像一个带有键值对的散列,在你的情况下有问题和答案)
当您查询有关该案例的问题时,您将获得一系列问题及其各自的答案,虽然该列表是动态的(可以添加任何问题/约会不需要具有相同的问题),它可以无缝地保存到数据库中