访问子类的字段

时间:2015-01-25 23:05:56

标签: ruby-on-rails ruby inheritance mongoid

编辑:抱歉,我忘了提到我使用的是Mongoid,那些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无法找到它们。知道怎么做吗?

2 个答案:

答案 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

希望得到这个帮助。