アクティブレコードモデルでは、serializable_hash
メソッドをオーバーライドし、必要に応じてオプションを設定した後にsuper options
を呼び出します。serializable_hash superは、オーバーライドされたメソッドで定義されたオプションをどのように取得しますか?
一般的に我々はやる:
def serializable_hash options=nil
options ||= {
only: [
:id,
:special_instructions
],
include: { images: nil },
methods: [:catalog_item_name, ]
}
super options
end
しかし、モデルの一つで、偶然、私たちはスーパーメソッドに明示的options
を渡すないました。それにもかかわらず、オプションを渡しているかのように動作しているようです。
serializable_hash source codeを読んだ後、スーパーメソッドでオプションを正しく初期化する理由が見つからないようです。
これはどのように起こっているのですか?
もちろん、ルビスクリプトで構造を再現しようとしても、同じように起こるようには見えません。ここ は、我々はそれを試してみるために書かれたものです:
module MyModule
def my_module_method options=nil
options ||= { test: 'Test' }
end
end
class MyTest
include MyModule
def my_module_method
options = { bingo: 'Bingo!' }
super
end
end
puts MyTest.new.my_module_method
これは{ test: 'Test' }
を印刷し、我々はオプション(super options
)を渡した場合(私たちが期待するよう)、(から