RailsでActiveRecordモデルのコレクションに対してメソッドを追加する


ActiveRecord::Baseを継承しているモデルのコレクションに対してメソッドを追加したいことがたまにあると思います。例えば次のような画面で

今表示しているsalesの平均価格を表示したいというような場合です。viewには次ような感じで書きたいんじゃないでしょうか。

Railsではこんなことも簡単に実現できます。モデルにメソッドを追加すれば良いだけ。

(rails4で動作確認しています。rails3のallは配列を返すので、scopedにすれば動くと思います)

一体どういう仕組でこのメソッドが呼び出されてるんでしょうか。ちょっとpry-stack_explorerで確認してみると・・・

method_missingを使ってデリゲートしているようです。黒魔術の定石ですね。このActiveRecord::Delegation::ClassSpecificRelationをのぞいてみます。

なるほどこうなっているのか。。Arrayにもデリゲートできるようですね(to_aされてしまうのでscopeチェインができなくなりますが)。う〜む・・こうしてみると、やはりrubyは偉大だと言わざるをえない。

関連する記事