3

我的 Ruby on Rails 应用程序中有一个小的类层次结构。我试图添加一个关注点,即支持描述具有一些我希望由子类继承的信息的类。这个问题可以用这个小样本来说明:

module Translatable
  extend ActiveSupport::Concern

  included do
  end

  module ClassMethods
    def add_translatable_fields(field_and_types)
      @translatable_fields ||= {}
      @translatable_fields.merge! field_and_types
    end

    def translatable_fields
      @translatable_fields
    end
  end
end

class Item
  include Translatable

  add_translatable_fields({name: :string})
end

class ChildItem < Item
end

class AnotherItem < Item
  add_translatable_fields({description: :text})
end

puts "Item => #{Item.translatable_fields.inspect}"
puts "ChildItem => #{ChildItem.translatable_fields.inspect}"
puts "AnotherItem => #{AnotherItem.translatable_fields.inspect}"

我希望这个示例代码返回

Item => {name: :string}
ChildItem => {name: :string}
AnotherItem => {name: :string, description: :text}

但不幸的是 ChildItem 和 AnotherItem 没有添加在父类上设置的类“属性”,而是返回

Item => {name: :string}
ChildItem => nil
AnotherItem => {description: :text}

如何使类继承按我想要的方式工作?

4

1 回答 1

3

看起来子类从父类正确继承,但问题是类变量

我敢打赌你能做到

class ChildItem < Item
  add_translatable_fields(Item.translatable_field)
end

但是我刚刚了解了这些 Rails 助手,它看起来更像您正在寻找的东西。

http://api.rubyonrails.org/classes/Class.html#method-i-class_attribute

您可以class_attribute在包含的块中定义 ,它应该按照您希望的方式继承给所有子项。

于 2014-12-08T23:38:05.927 回答