gpt4 book ai didi

ruby-on-rails - 子类化模型时的数据库和关系设计

转载 作者:数据小太阳 更新时间:2023-10-29 08:42:09 25 4
gpt4 key购买 nike

我有一个模型“任务”,它将 HABTM 许多“任务目标”。

然而,当谈到 TaskTargets 时,我正在编写抽象的基本 TaskTarget 类(尽可能多地在 Rails 中)。 TaskTarget 将被任何可以成为任务目标的任何东西的各种不同概念化子类化。所以说,软件子系统、客户站点、浴室等......

此处类的设计相当简单,但我遇到障碍的地方在于如何将它们关联在一起以及如何让 Rails 操纵这些关系。

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

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

选项 #2 我怀疑是最可靠的,但也许我遗漏了一些东西。感谢您提供的任何帮助,当然,我真的只是想确保我把它做对了,一次!

最佳答案

我认为您在 Rails 中可以(轻松)使用的两种方法是:

1) Single Table Inheritance :您创建一个单独的 TaskTarget 表,其中包含每个子类可能需要的每个字段。然后,您还可以添加一个存储类名的“类型”字段,Rails 几乎会为您完成剩下的工作。查看ActiveRecord api docs了解更多信息,尤其是“单表继承”部分。

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

第一个选项可以更轻松地执行诸如“显示所有 TaskTargets,而不考虑子类”之类的事情,并导致更少的表。它确实让准确判断一个子类相对于另一个子类可以做什么变得有点困难,如果你有 很多 TaskTargets,我想最终将它们全部放在一个表中可能是一种表现关注。

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

哪个选项更适合您的情况取决于您需要实现哪些操作以及您的数据集的特征。

关于ruby-on-rails - 子类化模型时的数据库和关系设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1120617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com