

このメソッドの中では基本的に様々なインスタンス変数が初期化されているわけですが、  
インスタンス変数が初期化される過程で **self** を調べていると@values = valuesが実行された後の  
selfが指しているものが変わっていることに気づきました。

[![結果からいうとこんな感じです。](https://i.stack.imgur.com/BEI5T.png)](https://i.stack.imgur.com/BEI5T.png)

一体何が行われているのかがわからなくて困ってます。  
**「なぜ、インスタンス変数を初期化しているだけなのにselfが指し示すものが変わるのでしょうか？」**

文章だけでは伝えきれないので手元で試せる例を用意しました。↓↓↓  
<https://github.com/yukihirop/relation_question>

回答の方よろしくお願いいたします。


CC BY-SA 3.0
2017-10-01T05:28:55.087
38335
2017-10-02T13:52:36.440
25612
question
ruby-on-rails ruby
ActiveRecord::Relationクラスのinitializeメソッドに関しての質問です。


変わったのは「selfが指しているもの」ではなく単なる表示です。

ActiveRecord::Relationは必要になったタイミングで初めてクエリを実行しデータをロードします。pやpryでオブジェクトの中身を覗いた時もそのタイミングです。

コードを追いかけたわけではありませんが、`@values`に値が入ってないとクエリが実行できないためデフォルトの`<クラス名:オブジェクトID>`表示、`@values`に値が入ったあとはクエリが実行できるようになったので実際のデータ表示、になったのでしょう。


CC BY-SA 3.0
2017-10-02T00:33:40.863
38349
2017-10-02T00:33:40.863
5793
38335
answer


selfが指し示すものが変わっているわけではありません。  
pryで`self`を出力したときの表示内容が変わっているだけです。  
pryで`self.object_id`を表示させれば、指し示すものが変わっていないことが分かると思います。

pryで出力される内容の仕様までは追っていませんが、おそらく`inspect`や`to_s`の内容を使用しているはずです。そう思って`relation.rb`のソースを見てみると、`inspect`メソッドをオーバーライドしているのが分かります。おそらくvalues代入前後で、このメソッドが返す結果が異なっているはずです。


CC BY-SA 3.0
2017-10-02T00:38:26.133
38350
2017-10-02T00:38:26.133
9608
38335
answer