ActiveRecord::Associations::CollectionProxy从哪里获取.each实例方法?

6
假设我有模型Topics和Posts,其中Topic has_many:posts,而Post belongs_to:topic。此时我的数据库中已经有一些内容。
如果我进入rails控制台并键入
Topic.find(1).posts

我相信我会得到一个CollectionProxy对象。

=> #<ActiveRecord::Associations::CollectionProxy [#<Post id:30, ......>]>

我可以调用 .each 来获取一个 Enumerator 对象。
=> #<Enumerator: [#<Post id: 30, ......>]:each>

我对CollectionProxy如何处理.each感到困惑。我知道它在某个时候被继承了,但我一直在阅读API文档,它们并没有很清楚地说明CollectionProxy从哪里继承,除非我漏看了什么明显的东西。 这个页面似乎没有告诉我太多信息,这个页面也是如此。
2个回答

7

6
为什么不尝试询问它来自何处?
> ActiveRecord::Associations::CollectionProxy.instance_method(:each).owner
=> ActiveRecord::Delegation 

UnboundMethod#owner方法:

返回定义该方法的类或模块。

所以each来自于ActiveRecord::Delegation。如果你查看ActiveRecord::Delegation你会看到这个:

delegate ..., :each, ... , to: :to_a

所以,each 被进一步传递到 to_a.each


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