ApplicationRecord关联方法查找如何工作?

时间:2016-09-24 00:41:13

标签: ruby-on-rails ruby ruby-on-rails-5

当我理解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的行为如此?我比较苹果和橘子吗?

1 个答案:

答案 0 :(得分:0)

与评论中的Max状态一样,当您使用元编程时,您没有定义方法,而是在调用它们,因此不会涉及继承。