【问题标题】:Datamapper, defining your own object methods, how?Datamapper,定义自己的对象方法,怎么做?
【发布时间】:2010-06-17 10:59:38
【问题描述】:

假设我有一个像下面这样的课程

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 和最新版本的数据映射器。

【问题讨论】:

  • 如果你只像 InstanceMethod 那样使用它,为什么要像 ClassMethod 一样定义它?

标签: ruby database datamapper


【解决方案1】:

避免所有的自我,它变成了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

【讨论】:

  • 不应该是 (:username => 'jim') 没有逗号吗?
【解决方案2】:

您可以将类范围视为Model(RDBMS 中的一个表),将实例范围视为Resource(RDBMS 中的一行)。现在,如果您定义类方法(就像您对 self.my_username 所做的那样),您将在 Model(又名表,又名 all 行)上进行操作。如果您定义实例方法,这些将可用于 Resource(又名 one 行)。

类方法的典型用例是构建(链)查询/IES。这些基本上与 Active Record 的 2.x named_scope 具有相同的效果。只要您不显式访问查询应该提供的数据,您就可以调用一系列类方法并让它不执行单个查询。 DataMapper 将继续构造和修改查询对象,直到您真正需要访问数据的那一刻。这仅在链中的每个类方法都返回 DataMapper::Collection 的实例时才有效,这通常是通过返回调用的结果来实现的和|

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2019-11-11
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多