2014-12-08 2 views
2

Ruby on Rails 응용 프로그램에 작은 클래스 계층 구조가 있습니다. 나는 하위 클래스에 의해 상속되기를 원하는 몇 가지 정보를 가지고 클래스를 기술하는 지원에 관심을 갖기 위해 노력했다.ActiveSupport :: Concern을 사용하여 클래스 메서드를 상속하는 방법

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 

하지만 난 그냥이 레일 헬퍼에 대해 알게 할 수 겠지, 그리고 더 당신이 찾고있는 것 같다.

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

당신이 포함 된 블록의 class_attribute을 정의 할 수 있으며 모든 아이들에게 당신이 원하는 방식을 상속합니다.

+0

감사합니다. @evanbikes! 'class_attribute' 도우미는 내가 아주 비슷한 것을 성취하는데 필요한 것입니다! – Dorian