ApplicationRecord 关联方法查找如何工作?
How does ApplicationRecord association method lookup work?
据我了解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 会这样?我是在比较苹果和橙子吗?
就像 Max 在评论中所说的那样,当您使用元编程时,您不是在定义方法,而是在调用它们,因此不涉及继承。
据我了解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 会这样?我是在比较苹果和橙子吗?
就像 Max 在评论中所说的那样,当您使用元编程时,您不是在定义方法,而是在调用它们,因此不涉及继承。