【问题标题】:Why does ActiveRecord in Rails not support Multiple Table Inheritance?为什么 Rails 中的 ActiveRecord 不支持多表继承?
【发布时间】:2015-01-08 19:41:23
【问题描述】:

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

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

【问题讨论】:

  • 我倾向于将诸如“大学球员”之类的东西视为球员所做的事情(或他们履行的角色),而不是他们身份的一部分。同样,如果你有一个人,那么“球员”和“教练”就是角色,而不是那个人的固有属性。我认为您的模型设置过于从字面上理解“是”的概念。
  • @muistooshort 您可能是对的,我只是将其作为附加信息提供。我主要是问为什么 Active Record 中没有多表继承支持。

标签: ruby-on-rails ruby activerecord rails-activerecord


【解决方案1】:

Rails 6.1+ 委托类型

Rails 6.1 添加了一种“原生”方式来通过delegated type 实现多表继承。

详情请见the corresponding PR

【讨论】:

    【解决方案2】:

    对您的问题的简短回答是因为 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++ 时,我尝试为不同的对象制作单独的模型,并且强烈需要遵守某种复杂的继承方案。您只需要问自己,当您的应用程序现在(不是未来,因为此时这是推测)时,这些类型之间的行为差​​异如此不同,以至于证明这种差异程度是合理的。

    编辑

    我与在 Active Record 工作的 Thoughtbot 的 Sean Griffin 进行了交谈,我问他为什么不支持多表继承,他的回答是:

    多态关联在大多数用例中扮演该角色

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 2011-03-24
    • 2011-04-15
    • 2016-04-18
    • 2014-03-04
    • 2011-03-17
    • 2011-02-21
    相关资源
    最近更新 更多