2

我有一个模型“Task”,它将 HABTM 许多“TaskTargets”。

然而,当涉及到 TaskTargets 时,我正在编写抽象的基本 TaskTarget 类(与 Rails 中的一样多)。TaskTarget 将由任何可以成为任务目标的任何不同概念化的子类。比如说,软件子系统、客户站点、浴室等……

这里的类设计相当简单,但我遇到的问题是我将如何将它们联系在一起,以及我将如何让 Rails 操纵这些关系。

我的第一个想法是我将拥有一个包含基本公共字段(名称、描述...)的 TaskTarget 表。然后,它还将与特定于实现类包装的数据类型的表具有多态关系。这意味着实现 TaskTarget 的类的一个实例的数据将在两个表中找到。

第二种方法是在 Task 和 TaskTarget 的子类之间创建多态 HABTM 关系,我认为我可以将表名 TaskTarget 用于连接表。

我怀疑选项#2是最强大的,但也许我遗漏了一些东西。感谢您的帮助,当然,我真的只是要求确保我把它做好,一次!

4

1 回答 1

4

我认为 Rails 中提供给您的两种方法(很容易)是:

1) Single Table Inheritance:您创建一个 TaskTarget 表,其中包含每个子类可能需要的每个字段。然后,您还添加了一个“类型”字段来存储类名,Rails 几乎会为您完成其余的工作。有关更多信息,请参阅ActiveRecord api 文档,尤其是“单表继承”部分。

2)具体表继承:基础 TaskTarget 类没有表。相反,只需为层次结构中的每个具体类创建一个表,其中仅包含该类所需的字段。

第一个选项可以更轻松地执行诸如“显示所有 TaskTargets,无论子类如何”之类的操作,并导致更少的表。与另一个子类相比,确切地说出一个子类可以做什么确实有点困难,而且如果您有很多TaskTargets,我想最终将它们全部放在一个表中可能是一个性能问题。

第二个选项使架构更清晰,更易于阅读,并且每个类都可以像任何普通的 ActiveRecord 模型一样工作。但是,连接所有 TaskTarget 表可能很麻烦,尤其是当您将来添加更多子类时。实现任何必要的多态关联也可能涉及一些额外的复杂性。

在您的情况下哪个选项更好取决于您需要实施的操作以及数据集的特征。

于 2009-07-13T17:13:46.910 回答