为什么Rails中的ActiveRecord不支持多表继承?

7
我试图实现一组我在纸上写下的模型,但遇到一个问题,我认为解决它最好的方法是使用多表继承设置。然而,在进行谷歌搜索后,我发现ActiveRecord不支持MTI……尽管有很多文章显示可以这样做。这让我想知道如果未实现,则我的模型设置是否正确。因此,我的问题是为什么Active Record没有内置MTI支持?如果你想知道我的模型设置会是什么样子,我会在下面留下它。
class Player < ActiveRecord::Base; end
class CollegePlayer < Player; end
class ProPlayer < Player; end

Player 可以是大学球员(CollegePlayer)、职业球员(ProPlayer)或两者兼而有之。另一个例子中...

class Person < ActiveRecord::Base; end
class User < Person; end
class Player < Person; end
class Coach < Person; end

“人”可以是用户球员和/或教练


1
我倾向于将“大学球员”之类的东西视为球员所做的事情(或他们履行的角色),而不是他们身份的一部分。同样,如果你有一个人,那么“球员”和“教练”就是角色,而不是该人的固有属性。我认为你的模型设置过于字面地理解了“是一个”的概念。 - mu is too short
@muistooshort 你可能是对的,我只是提供额外的信息。我主要想知道为什么 Active Record 没有多表继承支持。 - daveomcd
2个回答

2

Rails 6.1+ 委托类型

Rails 6.1通过 委托类型 提供了一种“本地”实现多表继承的方式。

详情请参见相应的PR


1
这个问题的简短答案是,ActiveRecord核心团队不想将此功能包含在内,并且社区需求不足。详情请参见https://github.com/rails/rails/issues/5541
如果你想得到权威答案,你需要问DHH(david.heinemeierhansson.com)或Aaron Tender Love Patterson(tenderlove@github.com),因为他们是active record项目的“领导”贡献者。
我的个人答案是,因为ActiveRecord已经足够复杂了。支持它已有的功能所做的元编程已经具有一定的挑战性,以使其维护和扩展变得更加困难。目前正在工作于AR的核心团队已经将大量精力放在进一步优化AR并重构组织上。考虑到已经有多种替代方法来获取多个表的继承,并且社区并没有强烈要求这个功能,因此这个功能的优先级较低。
尽管对于您关于数据库组织的正确性的另一个问题进行评论,我同意muistooshort的观点,似乎您可以通过角色实现所需的内容。当我第一次从C ++转来时,我试图为不同的对象制作单独的模型,并感到强烈需要遵守某种复杂的继承方案。您只需要问自己,因为您的应用程序现在处于什么状态(而不是未来,因为这在这一点上是推测),这些类型之间的行为差异是否如此不同,以至于需要这种程度的区分。

编辑

我与Thoughtbot的Sean Griffin交谈,他负责Active Record,我问他为什么不支持多表继承,他的回答是:

"对于大多数用例,多态关联可以发挥这种作用"


嗨!根据你的回答,我已经开了一个新线程。http://stackoverflow.com/questions/40073707/polymorphic-associations-can-be-used-for-mti-implementation 也许你有什么想说的? - okliv
我会去查看。 - C dot StrifeVII

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接