ActiveRecord::Baseにscope追加しても上手く動かないからダメだよ、という話

Pocket

バグなのか仕様なのかは分からないんですが、仕様ぽい感じもする動きです。

こんなコードを書いても動かない

あくまで一例ですが、テーブル内のdataカラム以外を取得したいなーというときに、以下のようなコードを書いたとします。いろんなテーブルにdataカラムがあるから、いっそActiveRecord::Baseに追加しちゃえという感じのコードです。

これでhoge.pages.without_dataという感じでスコープを使おうとすると、columns_withoutメソッドのselfがPageではなくActiveRecord::Baseを指してしまっていて、上手く動きません。

どうやらモデルの継承元で定義したスコープのselfは、継承元のクラスを指す動きになるようです。AbstractClassを作成しても、同じくAbstractClassを指す動きになっていました。

というわけで、scopeはそれぞれのモデルで定義をするか、モジュールを作ってそれぞれのモデルに直接mixinする必要がありそうです。