2010-06-17 1 views
3

그래서 내가이 프로그램을 실행할 때이 방법은 당신은 클래스 메소드를 정의 할 수 있습니다 더 조사에 찾을 수 없음을 알려줍니다 Datamapper, 어떻게 자신 만의 객체 메소드를 정의 할 수 있습니까?

class List 
    include DataMapper::Resource 
    property :id, Serial 
    property :username, String 

    def self.my_username 
    return self[:username] 
    end 
end 

list=List.create(:username=>,'jim') 
list.my_username 

아래 같은 클래스가 있다고 할 수 있습니다 (방법을 반대하지) 그 클래스 메소드는 오브젝트 데이터에 액세스 할 수 없습니다.

개체 메서드로 이러한 메서드를 포함하고 개체 데이터에 액세스 할 수있는 방법이 있습니까? Ruby 1.8.6과 datamapper의 최신 버전을 사용하고 있습니다.

+1

을 같이 그것을 정의하는 이유 – shingara

답변

7

않도록 모든 자신과가 될 InstanceMethod :

class List 
    include DataMapper::Resource 
    property :id, Serial 
    property :username, String 

    def my_username 
    return self[:username] 
    end 
end 

list=List.create(:username=>'jim') 
list.my_username 
+0

쉼표없이 (: username => 'jim')이 아니어야합니까? –

+0

오른쪽, 쉼표를 삭제합니다. – shingara

4

당신은 Model (AN RDBMS의 테이블)와 같은 클래스 범위 생각할 수와 RDBMS의 Resource (행으로 인스턴스 범위). 이제 클래스 메서드 (예 : self.my_username)를 정의한 경우 Model (별칭 : 모두 행) 테이블에서 작업하고 있습니다. 인스턴스 메서드를 정의하면 Resource (하나 행)에 사용할 수 있습니다.

클래스 메서드의 일반적인 용도는 쿼리를 구축하는 것입니다. 이것들은 기본적으로 액티브 레코드의 2.x named_scope과 같은 효과를냅니다. 쿼리가 제공해야하는 데이터에 명시 적으로 액세스하지 않는 한 클래스 메서드 체인을 호출하고 단일 쿼리를 실행하지 않도록 할 수 있습니다. DataMapper은 실제로 데이터에 액세스해야하는 순간까지 쿼리 개체를 구성하고 수정합니다. 체인의 모든 클래스 메소드는 일반적으로, -, &|all에 호출의 결과를 반환 (또는 + 같은 집합 연산자와 함께 이들을 결합하여 달성 DataMapper::Collection의 인스턴스가 반환하는 경우에만 작동합니다.