2014-12-08 3 views
2

У меня есть небольшая иерархия классов в моем приложении Ruby on Rails. Я попытался добавить беспокойство в поддержку описаний классов с некоторой информацией, которую я хотел бы наследовать дочерними классами. Проблема может быть проиллюстрирована с этой небольшой выборке:Как наследовать методы класса с помощью ActiveSupport :: Концерн

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} 

Как я могу сделать работу наследования класса так, как я ее хочу?

ответ

2

Похоже, что дочерние классы наследуются правильно от родителя, но проблема заключается в переменных класса .

Держу пари, вы могли бы сделать

class ChildItem < Item 
    add_translatable_fields(Item.translatable_field) 
end 

Но я только что узнал об этих хелперов Rails, и это больше похоже на то, что вы ищете.

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

Вы можете определить class_attribute в прилагаемом блоке, и он должен наследовать всем детям так, как вы хотите.

+0

спасибо @evanbikes! помощник 'class_attribute' - это то, что мне нужно для достижения чего-то очень похожего! – Dorian