field
是Mongoid的
我有一个rails应用程序负责生成Word文档(并替换其中的一些变量)
所以我有很多DocumentEtude::xxxx
个类超级基类DocumentEtude
类(英文ProjectDocument
)
class DocumentEtude
include Mongoid::Document
field :shared_field
class DocumentEtude:xxxx < DocumentEtude
field :only_in_xxxx_field
为了保持理智,我想将所有变量放在一个地方,并做这样的事情
class DocumentEtude
...
def variables
vars = {}
case _type
when 'DocumentEtude::xxxxx', 'DocumentEtude::yyyyyy', 'DocumentEtude::zzzzzz'
vars.merge!({
"some_var" => shared_field,
"some_var2" => only_in_xxxx_field
...
end
def generate_document
# Code that uses the variables defined before
end
现在问题是我在DocumentEtude中声明了这个方法
我需要访问一些仅在子类中声明的字段(例如only_in_xxxx_field
),但显然Ruby无法找到它们。知道怎么做吗?
答案 0 :(得分:1)
如果我理解你的问题,你想要有一些设置,它继承了类层次结构。如果是这种情况,请使用ActiveSupport的核心扩展class_attribute
。例如(从rails guide复制:
class A
class_attribute :x
end
class B < A; end
class C < B; end
A.x = :a
B.x # => :a
C.x # => :a
B.x = :b
A.x # => :a
C.x # => :b
C.x = :c
A.x # => :a
B.x # => :b
您必须注意的唯一事情是mutables
(就像您正在使用的哈希)。但是因为在你的情况下,甚至希望子类覆盖超类的值,你也可以去。
答案 1 :(得分:0)
您始终可以定义一个方法,该方法返回您在子类中定义的字段,并在父类方法中调用它。
实施例
class DocumentEtude
def variables
vars = {}
vars.merge!(
"some_var" => shared_field,
"some_var2" => your_customized_field)
...
end
end
class DocumentEtude::XXXX < DocumentEtude
field :only_in_xxxx_field
def your_customized_field
return only_in_xxxx_field
end
end
当然,最好让用户知道父类试图访问的某些字段是否未在子类中定义,方法是在父类中添加:
def your_customized_field
raise NotImplementedError, "This field is not defined yet!"
end
希望得到这个帮助。