2010-06-17 20 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

爲什麼將它定義成ClassMethod如果你只使用InstanceMethod? – shingara 2010-06-17 11:42:01

回答

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')沒有逗號? – 2010-11-14 03:06:14

+0

你的權利,我刪除逗號 – shingara 2010-11-14 08:02:49

4

你可以認爲類範圍爲Model(RDBMS中的一個表)和實例範圍內作爲一個RDBMS的Resource(一排)。現在,如果您定義類方法(就像您使用self.my_username所做的那樣),您正在使用Model(也稱爲表格,也稱爲全部行)。如果您定義實例方法,則這些將可用於Resource(又名一個行)。

類方法的典型用例是建立(鏈)查詢。這些基本上與Active Record的2.x named_scope的效果基本相同。只要不明確地訪問查詢應該提供的數據,就可以調用一系列類方法並讓它不執行單個查詢。 DataMapper將繼續構建和修改查詢對象,直到您實際需要訪問數據的那一刻。這僅如果鏈中的每一個類方法返回通常由調用的結果返回給all(或這些與集運營商如+結合,-&|實現DataMapper::Collection實例工作。

相關問題