我的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}
如何让类继承以我想要的方式工作?
答案 0 :(得分: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
,它应该按照您希望的方式继承给所有孩子。