如何从Ruby中的父代模块继承类变量

时间:2018-08-01 16:31:05

标签: ruby-on-rails ruby inheritance

我正在尝试为Active Record模型开发可重用的模块,以在模型中共享使用。除子类找不到变量外,它工作得很好。

用代码更容易证明这一点

这是模块:

module Scanner
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def scan(*fields)
      @scan = fields if fields.present?
      @scan
    end
  end
end

用法:

class User < ActiveRecord::Base
  include Scanner
  scan :user_name
end

呼叫User.scan返回:user_name。完美!

但是。这是一个问题:

class Admin < User
end

呼叫Admin.scan返回nil

为什么:user_name没有设置在父级中?我正在跟踪primary_keytable_name之类的方法的AR来源,它们似乎是从父级继承了值

1 个答案:

答案 0 :(得分:2)

class_attribute为您处理了必需的继承语义。如您所见,这并不像将实例变量放在类上那样简单,因为这样会将nil留在子类上:它们是 instance 变量,并且是一个单独的实例

您提到的示例还可以做其他更专业,更复杂的事情……但是您会在Rails源代码中找到许多使用class_attribute的简单示例。