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

时间:2015-07-11 02:46:19

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

让我们说我有模型主题和帖子,其中主题has_many:帖子和帖子belongs_to:主题。此时我的数据库中已经有了一些东西。

如果我进入rails控制台并输入

Topic.find(1).posts

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

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

我可以调用.each来获取一个Enumerator对象。

=> #<Enumerator: [#<Post id: 30, ......>]:each>

我很困惑CollectionProxy如何处理.each。我意识到它在某些时候继承了,但是我一直在阅读API文档,他们并没有清楚地说明CollectionProxy继承的是什么,除非我遗漏了一些明显的东西。 / p>

This page似乎没有告诉我太多,this page也没有。

2 个答案:

答案 0 :(得分:6)

ActiveRecord::Associations::CollectionProxy is inherited from RelationRelationeach以及许多其他方法转发给to_a

来自activerecord/lib/active_record/relation/delegation.rb#L45

  

委托:to_xml,:to_yaml,:length,:collect,:map,:each,:all?,:include?,:to_ary,:join,to :: to_a

有关delegate如何运作的绝佳解释,请参阅Understanding Ruby and Rails: Delegate

答案 1 :(得分:4)

你为什么不试着问它从何而来?

> ActiveRecord::Associations::CollectionProxy.instance_method(:each).owner
=> ActiveRecord::Delegation 

UnboundMethod#owner方法:

  

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

所以each来自ActiveRecord::Delegation。如果你看ActiveRecord::Delegationyou'll see this

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

所以each会进一步受到to_a.each的攻击。<​​/ p>