3

여러 모델을 관찰하는 순간 플러그인/젬을 개발하려고합니다. 이상적으로, 관찰자는여러 모델에 대해 ActiveRecord Observer를 동적으로 인스턴스화합니다.

class MyModel < ActiveRecord::Base 

    # a class method like this will tell the observer to observe this model 
    observe_me 

end 

내 초기 접근 방식은 클래스 메소드는 AR 기반에 포함 정의했다 ... 하나의 단일 방법으로 자동으로 인스턴스화해야합니다 다음

module ClassMethods 

    def observe_me 
    @observe_me = true 
    end 

    def should_observe_me? 
    @observe_me 
    end 
end 
ActiveRecord::Base.extend(ClassMethods) 

그리고 감지하려면이 옵션을 사용하는 모델은 관찰자 내에서 관찰 :

class MyObserver < ActiveRecord::Observer 

    # this should observe all models where should_observe_me? #=> true 
    observe ActiveRecord::Base.descendants.select { |m| m.try(:should_observe_me?) }.map(&:model_name) 

end 

내가 실행 해요 문제는 모델을 정의하기 전에 관찰자가 ActiveRe 있도록,로드되고 있다는 점이다 코드에는 후손이 없으며 MyObserver는 어떤 모델을 관찰해야할지 모릅니다.

내 다음 시도는 ActiveRecord :: Base.observers 및 ActiveRecord :: Base.instantiate_observers로 해킹했지만 운이 없었습니다. 이 순간에 같이

그래서 :

관찰자가 정의되어 있지만 관찰 할 수있는 모델을 알 수 없습니다. 모델을 정의하고 관찰하기 위해 자체적으로 플래그를 지정하지만 관찰자는 이미 관찰되었습니다.

모델이 정의되거나이 문제에 대한 더 나은 접근 방법을 생각할 때까지 관찰자의 로딩을 지연시킬 수있는 방법이 있습니까?

답변

-1

@ gavin : Rails3에서 응용 프로그램 초기화 구조가 변경되었습니다. 이것이 문제 일 수 있습니다.

언제/어떻게 ClassMethods 모듈을 포함합니까? 만약 당신이 Rails3에 있고 "require 'observe_me'"를 $ ROOT/config/environment.rb에 추가했다면, 당신이 묘사하는 (잘못된) 행위를 볼 수 있습니다.

그렇다면 대신 $ ROOT/config/initializers/my_extensions.rb 파일을 만들고 "require ..."를 붙이십시오.

+0

이것은 나를 위해 작동하지 않았다 – Dinedal

+0

@Dinedal : 작동하지 않는 부분을 확장 할 수 있습니까? –

관련 문제