読者です 読者をやめる 読者になる 読者になる

ActiveRecord::Relation Walkthrough

Railscastみたら覚えた事をすぐにブログに出すようにしてます。今回はActiveRecord::Relationの動きを追ってます。
すごい勉強になった気がします。

ActiveRecord::Relation

Rails3.0ではArel利用してQueryを遅延的に評価するようになっています。
whereやjoinなどはquery_methods.rb内で全てメソッドとしてclone.tapしています。(やっぱりtapはみんな好きですね)ここで返されてるオブジェクトが多分ActiveRecord::Relationです。詳しくコード追わないと僕レベルではわかりませんがActiveRecordないでquery_methods内で定義されたメソッドは:to => :scopedを指定されているからのようです。

ActiveRecord::NamedScope.scoped

上記のscopedはNamedScopeモジュールで定義されたscopedメソッドです。
このメソッドはよく読もう。relataionオブジェクトのマージとかして結局relationオブジェクトを返すみたい。だからquery_methodで何回呼び出してもActiveRecord::Relationインスタンスがかえるんですね!

なんで検索結果が配列がかえってくるんだろう

ActiveRecord::RelationインスタンスはArelの条件を持っているので実際にSQLを発行するときはarel_tableっていうArelオブジェクトを元にSQLを組み立てるようです。
ずっと謎だったのですがnamed_scopeとか利用しても最終的にはSQL発行後の配列がかえってきますよね。
Movieの中でinspect呼んでるんですがその中でto_aを呼んでいてそいつがfind_by_sqlして結果を返してるんです。きっとこの辺りが怪しいのでいつかの僕がその辺のコード読みます。

scopingメソッドがすごい

ActiveRecord::Relationはscopingメソッドみたいなのが使えるっぽいです。それはscope条件をキープしたままyieldするので検索条件を絞り込んだ上で処理を呼ぶ事ができるようですごい便利そうです。
きっといつかの僕がつかいます。