所以我想说我有一个类似下面的课程
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。
答案 0 :(得分: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
答案 1 :(得分:4)
您可以将类范围视为Model
(RDBMS中的表),将实例范围视为Resource
(RDBMS中的一行)。现在,如果您定义类方法(就像您使用self.my_username
所做的那样),那么您正在Model
(也就是表,又名所有行)上运行。如果您定义实例方法,这些方法将可用于Resource
(又名一个行)。
类方法的典型用例是建立(链)查询。这些基本上与Active Record的2.x named_scope
起到同样的效果。只要不显式访问查询应提供的数据,就可以调用一组类方法并使其不执行单个查询。 DataMapper
将继续构建和修改查询对象,直到您实际需要访问数据为止。这仅在链中的每个类方法返回DataMapper::Collection
的实例时才有效,这通常通过将调用结果返回all
(或将这些与+
,{{{}}}等集合运算符相结合来实现。 {1}},-
和&
。