Ruby Datamapper,如何定义自己的对象方法?

Ruby Datamapper,如何定义自己的对象方法?,ruby,database,datamapper,Ruby,Database,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 当我运行它时,它告诉我找不到该方法,并且在进

假设我有一门课,如下所示

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。

避免一切自我,它将成为实例方法:

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

您可以将类范围视为
模型(RDBMS中的一个表),将实例范围视为
资源(RDBMS中的一行)。现在,如果您定义类方法(就像您对
self.my_username
所做的那样),那么您就是在
模型上操作(也称为表,也称为所有行)。如果定义实例方法,这些方法将可用于
资源
(也称为一行)


类方法的典型用例是建立(链)查询。这些将基本上起到与Active Record的2.x
命名的\u范围
相同的效果。只要不显式访问查询应该提供的数据,就可以调用一系列类方法,使其不执行单个查询
DataMapper
将继续构造和修改查询对象,直到您实际需要访问数据的那一刻。只有当链中的每个类方法都返回一个
DataMapper::Collection
的实例时,这才有效,这通常是通过将调用结果返回到
all
(或者将它们与集运算符(如
+
-
&
|

组合使用)一起使用,如果只将其用作InstanceMethod,为什么要将其定义为ClassMethod?这不应该是没有逗号的(:username=>'jim')?