[英]How to inherit class variables from parents included module in Ruby
我正在尝试为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
? 我正在跟踪AR的源代码,例如primary_key
和table_name
方法,它们似乎是从父级继承值
class_attribute
为您处理所需的继承语义。 如您所见,这并不像将实例变量放在类上那样简单,因为这使子类上的实例变量nil
:它们是实例变量,并且是一个单独的实例。
您提到的示例还有其他一些更专业,更复杂的事情……但是,您会在Rails源代码中找到许多直接使用class_attribute
的简单示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.