2015-01-08 36 views
6

我试图实现一套我放在纸上的模型,遇到了一个问题,我认为最好的方法是使用多表继承设置。但是,谷歌搜索后,我发现ActiveRecord不支持MTI ......即使有大量文章显示如何完成。这让我想知道,如果没有实施,我是否正确设置了模型。所以我的问题是为什么Active Record不支持MTI?如果你对我的模型设置“将会”看起来像我会在下面留下好奇。为什么ActiveRecord in Rails不支持多表继承?

class Player < ActiveRecord::Base; end 
class CollegePlayer < Player; end 
class ProPlayer < Player; end 

如果能够向玩家CollegePlayer和ProPlayer的一种或两种。或者,在另一个例子......

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

当一个 “人” 可能是一个UserPlayer,和/或Coach

+1

我倾向于将诸如”大学球员“之类的东西视为球员所做的事情(或者他们扮演的角色)履行)而不是其身份的一部分。同样,如果你有一个人,那么“玩家”和“教练”就是角色,而不是那个人的固有属性。我认为你的模型设置将字面上的“是一个”概念。 –

+0

@ muistooshort你可能是对的,我只是将其作为附加信息提供。我主要问为什么Active Record中没有多表继承支持。 – daveomcd

回答

1

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

如果您想要明确的答案,您必须要求DHH(david.heinemeierhansson.com)或Aaron Tender Love Patterson([email protected]),因为他们是活跃记录项目的“主要”撰稿人。

我个人的回答是因为活动记录已经够复杂了。 ActiveRecord为支持其已经支持的功能而完成的元编程的数量对维护和扩展而言已经有点具有挑战性。目前致力于AR的核心团队一直非常重视进一步优化AR,以加快工作速度并重构它以清理组织。鉴于已经有多种方法可以获得像继承一样的多表,并且社区并不为这个功能而声名狼借,所以它的优先级不高。

虽然评论你关于你的数据库组织的正确性的其他问题,我同意muistooshort它似乎可以完成你想要的角色。当我第一次来自C++时,我试图为不同的对象创建单独的模型,并且也非常需要坚持某种令人费解的继承方案。你只需要问自己,因为你的应用程序现在代表现在(不在路上,因为这是猜测)是这些类型之间的行为如此不同的差异,它证明了这种差异化的程度。

编辑

我Thoughtbot的肖恩·格里芬谁的活动记录的作品说话了,我问他为什么多表继承不支持他的回应是:

多态关联填写大多数用例的角色

+0

嗨!我已经开始根据你的答案新线程http://stackoverflow.com/questions/40073707/polymorphic-associations-can-be-used-for-mti-implementation也许,你有话要说 – okliv

+0

我会检查出来 –