2010-08-20 5 views
2

특정 모듈을 포함하는 모든 클래스를 알려주는 메소드를 작성하려고합니다. 모양은 다음과 같습니다. -레일즈에서 실행되는 Ruby 클래스에 모듈이 포함되는시기는 언제입니까?

def Rating.rateable_objects 
    rateable_objects = [] 
    ObjectSpace.each_object(Class) do |c| 
    next unless c.include? Rateable 
    rateable_objects << c 
    end 
    rateable_objects 
end 

"평가 대상"은 여러 모델에 포함 된 모듈입니다.

내가 찾는 것은 레일 콘솔을 부팅하거나 서버를 실행 한 직후에이 메소드를 호출하면 []를 반환한다는 것입니다. 하지만 먼저 소비 모델 중 하나의 인스턴스를 인스턴스화하면 결과에서 해당 모델을 반환합니다.

언제 모듈이 포함될 예정입니까? 나는 그가 응용 프로그램이 시작될 때보 다 나중에 프로세스에서 추측하고 있습니다. 내가이 정보를이 과정에서 일찍 얻을 수 없다면, 어쨌든 이것을 달성 할 수 있습니까?

+0

모듈을 포함하는 모델이 호출 될 때로드 될 것이라고 생각합니다. –

답변

4

클래스 정의시 include 문을 실행하면 포함됩니다. 레일스는 모듈/클래스를 처음 사용할 때 자동로드합니다. 또한 다음과 같이 시도해보십시오.

module Rateable 
    @rateable_object = [] 
    def self.included(klass) 
    @rateable_objects << klass 
    end 
    def rateable_objects 
    @rateable_objects 
    end 
end 

이렇게하면 클래스가 모듈을 포함하므로 빌드됩니다.

+0

불행히도 "레일스 자동로드 모듈/클래스를 처음 사용할 때"는 내가하고 싶은 것을 얻을 수 없다는 것을 의미하지만 그다지 정확하지는 않습니다. 감사. – JoshReedSchramm

+0

@rateable_objects 대신 @@ rateable_object가되어서는 안됩니까? – MhdSyrwan

관련 문제