2011-01-12 9 views
1

나는 플러그인 내에서 새로운 관계를 동적으로 정의하는 플러그인을 작성 중이다. 샘플 코드는 모든 모델에서 지금인스턴스 변수에 저장된 모델의 속성을 얻는 방법

module AttachDocumentsAs 
    @as = nil 
    def attach_documents_as(*attachment_as) 
     attachment_as = attachment_as.to_a.flatten.compact.map(&:to_sym) 
     @as   = attachment_as.first 
     class_inheritable_reader(@as) 

     class_eval do 
      has_many @as, :as => :attachable, :class_name=>"AttachDocuments::Models::AttachedDocument" 
      accepts_nested_attributes_for @as 
     end 
    end 
end 

아래에 주어진 내가

class Person < AtiveRecord::Base 
    attach_documents_as :financial_documents 
end 

지금이

def initialize(*args) 
    super(*args) 
    "#{@as}".build 
end 
같은 과부하 초기화 방법에 클래스의 속성에 액세스하려면 액세스 할

로 사용

하지만 필수 속성을 얻지 못하고 있습니다. 아무도 나를 도와 줄 수 없습니다. 이 관계를 만들고 초기 값을 설정하고 싶습니다.

여러분 모두의 지침을 기다리고 있습니다.

답변

0

@as 클래스 인스턴스 변수 (Person의 클래스 메소드에서만 사용 가능)와 @as 인스턴스 변수 (이 클래스의 인스턴스에서만 사용 가능)를 혼동스럽게 할 수 있습니다. 그 설명조차 약간 복잡하게 들린다.

각 개체에는 인스턴스 변수가 있고 클래스는 단순히 개체 유형입니다. 이 클래스의 인스턴스도 객체이며 자체 독립 인스턴스 변수가 있습니다. 클래스 인스턴스에서 클래스 인스턴스 변수를 가져 오려면 정의한 것처럼 독자 메소드가 필요합니다. 아마 당신은 무슨 뜻입니다 :

def initialize(*args) 
    super(*args) 

    # self.class.as returns something like :financial_documents, so use this method 
    # to return a scope to build in. 
    send(self.class.as).build 
end 

당신이 @as 사용중인 방법은 당신은 당신이 ${$as} 때와 수도처럼 해제 참조 할 수 PHP 또는 Perl 같은 것을 사용하고 제안합니다. 루비에서는 보통 문자열이나 심볼을 클래스 또는 메소드로 참조 해제합니다.

심볼을 메소드 호출로 변환하려는 것 같습니다. 코드는 send입니다.

문자열을 클래스로 변환하려는 경우 Rails 환경의 기능인 문자열에서 constantize 메서드를 사용합니다. (: atd_as) write_inheritable_attribute (: atd_as, @as)

+0

내가 class_inheritable_reader (@as) class_inheritable_reader 사용 지금 내 전 ( self.send로 self.send 그것을 얻을 수 초기화를 (: atd_as)) 하지만 이제 문제는 빌드를 호출하는 것입니다. self.send (self.send (: atd_as)) 빌드 이 작동하지 않습니다. –

관련 문제