2015-07-11 42 views
5

假設我有模型主題和帖子,其中主題has_many:帖子和帖子belongs_to:主題。此時我的數據庫中已經有了一些東西。ActiveRecord :: Associations :: CollectionProxy獲取.each實例方法在哪裏?

如果我進入軌道控制檯,然後輸入

Topic.find(1).posts 

我相信我得到一個CollectionProxy對象。

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

我可以調用.each這個來獲得一個Enumerator對象。

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

我很困惑,因爲CollectionProxy是如何處理.each的。我意識到它在某些時候被繼承了,但我一直在閱讀API文檔,並且他們沒有清楚的知道CollectionProxy是從哪裏繼承的,除非我遺漏了一些明顯的東西。

This page似乎並沒有告訴我很多,而且也不this page

回答

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