Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 子类化模型时的数据库和关系设计_Ruby On Rails_Ruby_Database Design_Subclassing_Polymorphism - Fatal编程技术网

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

Ruby on rails 子类化模型时的数据库和关系设计,ruby-on-rails,ruby,database-design,subclassing,polymorphism,Ruby On Rails,Ruby,Database Design,Subclassing,Polymorphism,我有一个模型“任务”,它将包含许多“任务目标” 然而,当谈到TaskTargets时,我正在编写基本的TaskTarget类,它是抽象的(在Rails中尽可能多)。TaskTarget将被各种不同的概念化子类化,这些概念化可以是任务的目标。比如说,软件子系统、客户站点、浴室等等 这里的类的设计相当简单,但我遇到的问题是如何将它们联系在一起,以及如何让rails操纵这些关系 我的第一个想法是,我将有一个TaskTarget表,其中将包含基本的公共字段(名称、描述…)。然后,它还将与特定于实现类所包

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

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

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

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

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


我怀疑选项2是最稳健的,但也许我遗漏了什么。谢谢你的帮助,当然,我真的只是想确保我做对了,一次

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

1) :创建一个TaskTarget表,其中包含每个子类可能需要的每个字段。然后还添加了一个存储类名的“type”字段,Rails将为您完成其余的工作。有关更多信息,请参阅,特别是“单表继承”部分

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

第一个选项使“显示所有TaskTargets,而不考虑子类”这样的操作变得更容易,并导致更少的表。与其他子类相比,它确实使我们更难准确地判断一个子类可以做什么,如果您有很多TaskTargets,我想最终将它们全部放在一个表中可能会影响性能

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


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

我绝对不喜欢单表方法。虽然它完全概括了这段关系,但我怀疑这将在许多方面成为一场噩梦。我倾向于第二种解决方案,即任务和不同任务目标之间的多态关系。这似乎是Rails最擅长的方法。我仍然欢迎对此进行任何形式的讨论或其他回答!谢谢那么,你预期的层次结构有多复杂?如果它是一个相对较小的类集合,在必填字段中有很多重叠,我认为单表继承可能是更简单的方法,因为它意味着您不必处理多态关联,Rails可以为您处理大多数棘手的部分。另一方面,如果你认为子类的数量可能非常大,那么是的,TaskTarget表可能会失控。我怀疑子类的数量可能会增加。它们存在的全部原因是,我可以封装在不同任务目标之间并不总是通用的数据片段。我想知道是否有更简单的方法来解决这个问题。您计划在这些不同的子类中加入什么样的不同信息?有没有一种方法可以让单个TaskTarget类与目标本身具有多态关联?嗯,那么。。。系统中的每一个“东西”都可能是任务的目标,因此您正在创建TaskTarget类的并行类层次结构?有什么理由不只是在事物本身中存储名称和描述,而不是创建这个并行层次结构?为什么有一个TaskTarget类呢?