3
私はRubyの継承とメソッドのルックアップを理解しているので、子インスタンスが親のインスタンスメソッドを呼び出すと、親と子の両方に名前が付けられたメソッドが呼び出され、スコープはまだ子インスタンスにあります。だから、これは起こります:ApplicationRecord関連メソッドの検索はどのように機能しますか?
class Foo
def method1
"foo"
end
def method2
puts method1
end
end
class Bar < Foo
def method1
"bar"
end
end
Bar.new.method2
=> "bar"
私はActiveRecordの団体と同じようなことだと思う何しかし、私は私が期待するもの得ることはありません:
class Foo < ApplicationRecord
has_many :orders
has_many :order_items, through: :orders
end
class Bar < Foo
has_many :orders, -> { where(attribute1: 1) }
end
私はbar.orders
を呼び出すとき私は期待しているものを手に入れます。しかし、bar.order_items
と呼ぶと、foo.order_items
(クエリスコープは使用されていない)と同じ結果になります。 has_many :orders_items, through: :orders
をbar.rbに含めると、予想どおりに動作します。 ApplicationRecordsがこのように動作するのはなぜですか?私はリンゴとオレンジを比較していますか?
リンゴとオレンジをオレンジと比較していますか? - はい - 最初の例はインスタンスメソッドの継承ですが、 'has_many:orders'はクラス自体で動作するメタプログラミングです。 – max