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

时间:2010-06-17 10:59:39

标签: 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

当我运行它时,它告诉我无法找到该方法,并且在更多调查中您只能定义类方法(而不是对象方法),并且该类方法无法访问对象数据。

有没有办法将这些方法作为对象方法包含在内并获取对象数据?我正在使用Ruby 1.8.6和最新版本的datamapper。

2 个答案:

答案 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}},-&