1

在我的 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

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

4

2 回答 2

1

您所描述的内容听起来像是单表继承 (STI) 的强大用例。这意味着您实际上有一个表,其中包含 3 个特定情况(A、B、C)中所有属性的超集,并且 rails 知道拉出正确的表。

一篇很好地描述了这一点的博客文章在这里:

http://blog.eizesus.com/2009/10/sti-best-practices-in-rails/

但这取决于 - 上面链接中的“坏例子”很糟糕,因为属性之间没有重叠。如果您有相对大量的重叠,STI 可能是您的胜利。

如果您打算使用单独的表,您正在查看您的案例和子案例模型之间的 has_many/belongs_to 关系。您可能希望在 Case 对象上使用自定义验证方法,以确保仅存在一种特定的案例类型。

于 2012-12-14T17:40:22.003 回答
0

What i actually want is some kind of a multiple table inheritance. Looking around i came up with this article, explaining how to implement a solution using polymorphic relations. It is exactly what we want to achieve.

http://mediumexposure.com/multiple-table-inheritance-active-record/

于 2012-12-14T18:59:29.250 回答