18345

[code]

    u = User.find(1)
    u.class #=> User
    u.class == User #=> true
    
[/code]

* * *
[code]

    uw = User.where(id: 1)
    uw.class == ActiveRecord::Relation #=> false
    uw.class < ActiveRecord::Relation #=> true
    
    uw.class #=> User::ActiveRecord_Relation
    uw.all.class #=> User::ActiveRecord_Relation
    
    uw.each{|o| puts o.class #=> User }
    
[/code]

* * *

`uw.all.class`ですが **Array** を返すと思っていたのですが、  
**ActiveRecord::Relation** を継承した **User::ActiveRecord_Relation** でした。

さて、`uw.each`の`each`ですが、これはどのオブジェクトのメソッドでしょうか？  
[ActiveRecord::Relation](http://api.rubyonrails.org/classes/ActiveRecord/Relation.html)  
ドキュメントには見当たらないように思います。


CC BY-SA 3.0
2015-11-03T01:40:42.670
18343
2015-11-03T02:41:26.117
9008
question
ruby-on-rails rails-activerecord
RailsのActiveRecord::Relationのeachについて


手元のRailsプロジェクトで調べてみるとこのように表示されました。

[code]

    irb(main):009:0> Student.all.method(:each).source_location
    => ["/Users/jit/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.4/lib/active_record/relation/delegation.rb", 46]
    
[/code]

GitHub上ではこちらのコードになります。

<https://github.com/rails/rails/blob/v4.2.4/activerecord/lib/active_record/relation/delegation.rb#L46>

メソッドの定義場所がわからない場合は、`source_location`メソッドを使うと便利です。

参考： [Rubyでメソッドの定義場所を見つける方法 -
Qiita](http://qiita.com/jnchito/items/fc8a61b421d026a23ffe)


CC BY-SA 3.0
2015-11-03T02:41:26.117
18345
2015-11-03T02:41:26.117
85
18343
answer