当我理解Ruby继承和方法查找时,当子实例调用父实例方法时,该实例方法又调用父和子中都命名的方法,范围仍在子实例。所以这将会发生:
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
时的结果相同(不使用查询范围)。如果我在 bar.rb 中加入has_many :orders_items, through: :orders
,则其行为符合我的预期。为什么ApplicationRecords的行为如此?我比较苹果和橘子吗?
答案 0 :(得分:0)
与评论中的Max状态一样,当您使用元编程时,您没有定义方法,而是在调用它们,因此不会涉及继承。