rails中的多表继承

时间:2012-12-14 15:54:39

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord orm

在我的rails应用中,我有一个CASE域实体,作为特定于案例的域模型的逻辑超类(即CASEACASEBCASEC )像这样:

               +--------+
               |  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

使用活动记录实现此关系的最佳方法是什么?

2 个答案:

答案 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/