2016-09-24 3 views
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: :ordersbar.rbに含めると、予想どおりに動作します。 ApplicationRecordsがこのように動作するのはなぜですか?私はリンゴとオレンジを比較していますか?

+1

リンゴとオレンジをオレンジと比較していますか? - はい - 最初の例はインスタンスメソッドの継承ですが、 'has_many:orders'はクラス自体で動作するメタプログラミングです。 – max

答えて

0

コメントの最大状態と同様に、メタプログラミングを使用しているときにメソッドを定義していないので、継承はありません。

関連する問題