我正在尝试为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_key
和table_name
之类的方法的AR来源,它们似乎是从父级继承了值
答案 0 :(得分:2)
class_attribute
为您处理了必需的继承语义。如您所见,这并不像将实例变量放在类上那样简单,因为这样会将nil
留在子类上:它们是 instance 变量,并且是一个单独的实例
您提到的示例还可以做其他更专业,更复杂的事情……但是您会在Rails源代码中找到许多使用class_attribute
的简单示例。