Rails: ActiveRecord的Base和Relation - 为什么有两个类?

3

我曾经阅读过这样的说法:"当涉及到主要的CRUD方法时,关系就像模型一样工作。"

为什么不让关系完成所有工作,拥有Base实例化然后返回Relation有什么意义,显然它们共享相同的关注点


我同意。相关:base - willglynn
1个回答

1
在Rails 3中,数据库行为被分解成不同的混合模块。这样,某些东西可以进行验证而无需继承ActiveRecord::Base。ActiveRecord::Base类引入了执行数据库操作所需的所有混合模块。
此外,关系实际上不是记录或记录集。它可以保持查询的基础形式,因此可以链接到链中,直到链中的某个内容返回记录或记录集。
因此,where方法返回一个Relation对象。该对象可以调用where以返回具有查询中另一个过滤器的另一个Relation对象。等等,直到调用all、first、count或其他方法来使返回的对象成为查询结果。

很抱歉,我觉得这个评论并不是很有用。我来分开回答:首先,我不确定第一个部分如何回答我的问题,因为Relation不是一个模块,它是一个类,并且由Base实例化(正如我所说)。懒惰和可链接性(第二和第三部分)显然不会阻止Relation实现Base的功能,它已经实现了(正如我所说)。总之,我仍然不明白为什么要从Base开始。 - user1689037
1
(1) Base引入其他功能,例如验证。因此,该功能被组织成不同的部分(mix-ins或与Relation一样的聚合模式),并在用户(程序员)API Base类中汇集在一起。 (2) Relation的基本性质很复杂,最好将所有这些复杂性隔离开来,并从Base中通过聚合模式访问它自己的类中的查询结果集。 - Marlin Pierce

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