2012-11-22 5 views
1

다른 모델의 테이블에있는 항목을 기반으로 메서드를 정의하는 모델이 있습니다 (예 : Article 및 Type). 기사 habtm 형식 및 그 반대로.다른 모델의 방법을 레일에 강제로 다시로드 하시겠습니까?

나는 Article.rb에 정의

Type.all.each do |type| 
    define_method "#{type.name}?" do 
    is?(:"#{type.name}") 
    end 
end 

이 좋은 작품! 당신이 제 모델을로드 할 때

article.type? 

그러나, 이러한 방법은 실행이 같은 날 관련된 방법의 유형 dB 결과의 모든 유형이 생성되는 것을 확인 할 수 있습니다. 예를 들어 Rails Console에서 새로운 Type을 작성하면 article.type_name 메소드가 생성됩니까? 내가 reload!까지 정의되지 않을 것이다.

또한 test/rspec에도 동일한 문제가 있습니다. 특정 수의 유형을 만들면 관련 메소드가 아직 존재하지 않습니다. 그리고 rspec에서 User 모델을 다시로드하는 방법을 모르겠습니다.

해결책을 아는 사람이 있습니까? 아마도 새로운 모델을 만들 때 Article 모델의 메서드를 다시로드 할 수있는 방법이 있을까요? 이것은있을 법하지 않겠지 만 .. 어떤 조언이나지도가 좋을 것입니다!

답변

0

나는 모델을 다시로드하지 않고 api를 조금 변경하는 것이 좋을 것이라고 생각합니다. Article에서보다 일반적인 방법을 통해 단일 액세스 지점에 정말로 반대합니까? 당신은 각 유형에 대해 별도의 방법을 가지고 설정하는 경우

def type?(type) 
    return is? type if type.is_a? String # for when type is the Type name already 
    is? type.name      # for when an instance of Type is passed 
end 

,이 같은 아마 뭔가이 더 나은 이유를 내가 볼 수있는, 당신의 Type 클래스

after_insert do 
    block = eval <<-END.gsub(/^ {6}/, '') 
    Proc.new { is? :#{self.name} } 
    END 

    Article.send(:define_method, "#{self.name}?", block) 
end 
+0

네에서 작동합니다. 그러나 기존 시스템에서 개발 중이며 일부는 article.type_name에 따라 다릅니다. 가능하지 않다면 이걸 버려도됩니다. – jay

+0

몇 분만 더 기다렸다가 대답을 업데이트하겠습니다. 'after_insert' 블록에서'Article'에'define_method'를 호출하기 위해'Type'에 추가 할 수 있습니다. – deefour

+0

cool. 그냥 생각 : after_insert? 또는 after_commit 중 어느 것이 더 신뢰할 수 있습니까? – jay

관련 문제