ActiveRecord::Relationのメソッド…だったっけ?
ActiveRecordのオブジェクトは、メソッドチェーンでどんどん絞り込めるという便利な特性があります。さらに、モデルのクラスメソッドまで借りてきて動作してしまいます。
絞り込みのメソッドチェーン
RailsのActiveRecordによるモデルは、.where(条件1).where(条件2)
というように、次々と絞り込んで、最後にまとめてSQLを発行することができます。
これはどういう仕組みなのかというと、.where()
でActiveRecord::Relation
というクラスのオブジェクトを生成していて、実際にデータが必要になるまでSQLを生成するのを待つ一方で、さらに別な絞り込み条件を指定すると、内部的に条件を組み立てて、最終的なSQLの生成に備えています。なお、p
で出力すると全データが出ますが、これはp
のために生成したものです。
スコープを使う
scopeの詳細は他項に譲りますが、一言で言えば「検索用にモデルクラスに生やせるクラスメソッド」です。そして、このscopeは、SomeModel.some_condition
のように、直接モデルクラスのメソッドとして使うだけでなくて、SomeModel.where(...).some_condition
というように、メソッドチェーンの途中で呼び出すこともできます。
あれっ?
上で述べたように、.where
の返り値はActiveRecord::Relation
であって、SomeModel
のクラスではありません。それなのに、なぜ全然違うクラスのクラスメソッドを呼び出せてしまうのでしょうか。
委譲の仕組み
気になったのでソースを追いかけてみると、ActiveRecord::Relation
が読み込むモジュールの中にActiveRecord::Delegation
というのがありました。
ここのソースを見てみると、単にmethod_missing
で流すだけではなく、一度見つけたメソッドを実際に定義することで次からは普通に呼び出せるようにする、なんて処理を行っていました。
Author And Source
この問題について(ActiveRecord::Relationのメソッド…だったっけ?), 我々は、より多くの情報をここで見つけました https://qiita.com/jkr_2255/items/e11589e83d516888beed著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .