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

我试图实现一组我在纸上放在一起的模型并遇到了一个问题,我认为最好的方法就是使用多表inheritance设置。 然而,谷歌搜索后我发现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 

“人”可以是User前任 Player和/或Coach

对您的问题的简短回答是因为ActiveRecord核心团队不希望包含此function以及社区的需求不足。 请参阅https://github.com/rails/rails/issues/5541

如果您想要明确的答案,您将不得不问DHH(david.heinemeierhansson.com)或Aaron Tender Love Patterson(tenderlove@github.com),因为他们是活跃记录项目的“主要”贡献者。

我个人的答案是因为积极的记录已经足够复杂了。 为ActiveRecord支持其已支持的function而进行的元编程的数量已经有点难以维护和扩展。 目前正在研究AR的核心团队一直非常关注进一步优化AR以更快地工作并重构它以清理组织。 鉴于已有替代方法可以获得多个表,例如inheritance,并且社区不要求此function,因此优先级较低。

虽然评论你关于DB组织正确性的另一个问题,但我同意muistooshort似乎你可以用角色完成你想要的。 当我第一次来自C ++时,我试图为不同的对象制作单独的模型,并且强烈需要遵循某种复杂的inheritance方案。 你只需要问自己,因为你现在的应用程序(不是在路上,因为在这一点上的推测)是这些类型之间的行为差​​别,这certificate了这种程度的差异化。

编辑

我与Thoughtbot的Sean Griffin谈过,他在Active Record上工作,我问他为什么多表inheritance不支持他的反应是:

对于大多数用例,多态关联填补了这个角色