我有一个“任务”模型,它将包含许多“任务目标”。
然而,当谈到tasktargets时,我正在编写基本的tasktarget类,它是抽象的(在rails中也是如此)。task target将由任何可以作为任务目标的对象的不同概念化的子类。也就是说,软件子系统、客户站点、浴室等…
这里的类设计相当简单,但我遇到的问题是如何将它们联系在一起,以及如何让rails操作这些关系。
我的第一个想法是,我将有一个tasktarget表,它将包含基本的公共字段(名称、描述…)。然后,它还将与实现类包装的特定数据类型的表建立多态关系。
这意味着实现tasktarget的类的一个实例的数据将在两个表中找到。
第二种方法是在task和tasktarget的子类之间创建多态habtm关系,我认为可以将表名tasktarget用于联接表。
我怀疑选项2是最有力的,但也许我遗漏了一些东西。谢谢你的帮助,当然我只是想确保我把事情做好,一次!
最佳答案
我认为在rails中有两种方法(很容易)可供您使用:
1)Single Table Inheritance:创建一个tasktarget表,其中包含每个子类可能需要的每个字段。然后您还添加了一个存储类名的“type”字段,rails将为您完成剩下的工作。有关更多信息,请参见ActiveRecord api docs部分,特别是“单表继承”部分。
2)Concrete Table Inheritance:没有基本任务目标类的表。相反,只需为层次结构中的每个具体类创建一个表,其中只包含该类所需的字段。
第一个选项使“向我显示所有的tasktargets,不管子类是什么”这样的操作变得更容易,并导致更少的表。它确实让我们更难准确地判断一个子类能做什么,而不是另一个子类,而且如果您有很多tasktarget,我想最终将它们全部放在一个表中可能是一个性能问题。
第二个选项使模式更清晰,更易于阅读,并且每个类的工作方式与任何普通的activerecord模型都差不多。但是,跨所有tasktarget表联接可能会很麻烦,特别是在以后添加更多子类时。实现任何必要的多态关联也可能涉及一些额外的复杂性。
在您的情况下,哪个选项更好取决于您需要实现的操作以及数据集的特性。
关于ruby-on-rails - 子类化模型时的数据库和关系设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1120617/