私はドキュメントからactivesupportの::懸念のthis例で少し混乱しています:あなたが含まれたり、クラスにモジュールを拡張する際にモジュールにclass_evalブロックまたはinstance_evalブロックで定義されたRailsスコープ?
module M
def self.included(base)
base.extend ClassMethods
base.class_eval do
scope :disabled, -> { where(disabled: true) }
end
end
module ClassMethods
...
end
end
self.included
が呼び出されます。 base
は、オブジェクトがクラスオブジェクトでもオブジェクトインスタンスでも、オブジェクトを参照します。 extend
のbase
には、base
のModule for singleton methodsのメソッドが含まれます。 include
は、メソッドをクラスオブジェクトのインスタンスに追加します。
しかし、class_evalはクラスオブジェクトのインスタンスにインスタンスメソッドを追加するためにも使用されます。ただし、scope
はクラスメソッドです。
オブジェクトを取得およびクエリするためのクラスメソッドを追加します。
scope
ので
なぜclass_eval
なくinstance_eval
を用いた例であり、クラスメソッドでありますか?
class_evalブロックが呼び出されると、クラスメソッドが呼び出されます。この記事は次のように役立ちます:http://engineering.appfolio.com/appfolio-engineering/2013/06/17/ruby-mixins-activesupportconcern – Donato