在我的rails应用中,我有一个CASE
域实体,作为特定于案例的域模型的逻辑超类(即CASEA
,CASEB
,CASEC
)像这样:
+--------+
| CASE |
+--------+
^
|
+-------------+-------------+
| | |
+-------+ +-------+ +-------+
| CASEA | | CASEB | | CASEC |
+-------+ +-------+ +-------+
我们的想法是让一个域模型具有所有案例共有的属性,以及每个特定案例类型的一个域模型,它封装了特定于该案例的属性。
我需要使用双向一对一关系来实现多表继承设计,其中每个特定案例实例(CASEX
)必须引用一个且仅一个案例实例( CASE
)。相反,每个CASE
实例应引用一个且仅一个案例特定实例(CASEX
)。请注意,每个特定情况都是不同的域模型类。此外,我希望 CASE 成为关系的所有者,以便将保存,更新和删除级联到另一端,如下所示:
case = Case.new
case.case_info = CaseX.new
case.save!
# both case and CaseX are validated and saved
使用活动记录实现此关系的最佳方法是什么?
答案 0 :(得分:1)
您所描述的内容听起来像是单表继承(STI)的强大用例。这意味着你确实有一个表在3个特定情况下(A,B,C)具有所有属性的超集,并且rails知道要拉出正确的。
一篇描述此内容的博客文章在这里:
http://blog.eizesus.com/2009/10/sti-best-practices-in-rails/
这取决于 - 由于属性之间缺乏重叠,上述链接中的“错误示例”很糟糕。如果你有相对大量的重叠,STI可能是你的胜利。
如果您开始使用单独的表,那么您正在查看案例和子案例模型之间的has_many / belongs_to关系。您可能希望在Case对象上使用自定义验证方法,以确保只存在一种特定的案例类型。
答案 1 :(得分:0)
我真正想要的是某种多表继承。环顾四周,我想出了这篇文章,解释了如何使用多态关系实现解决方案。这正是我们想要实现的目标。
http://mediumexposure.com/multiple-table-inheritance-active-record/