1

我刚开始使用 DataMapper,发现自己经常做这种事情:

class MyModel
  include DataMapper::Resource

  property :id, Serial
  property :serialized_credentials, String

  def credentials
    @credentials ||= YAML.load(self.serialized_credentials)
  end

  def credentials=(c)
    @credentials = nil
    self.serialized_credentials = YAML.dump(c)
  end

end

这允许我为凭据传递一个哈希(例如)。

但是 DataMapper 是否已经为此提供了一种机制?

4

2 回答 2

2

您可以使用ObjectDataMapper 提供的类型:

class MyModel
  include DataMapper::Resource

  property :id, Serial
  property :credentials, Object
end

然而,这将使用Marshal.dump而不是YAML.dump,但您可以通过定义自己的类型来干燥它:

class YAMLObject < DataMapper::Type
  primitive String

  def self.dump(value, property)
    Base64.encode64(YAML.dump(value))
  end

  def self.load(value, property)
    value.nil? ? nil : YAML.load(Base64.decode64(value))
  end
end

然后你可以像使用任何其他类型一样使用它:

class MyModel
  include DataMapper::Resource

  property :id, Serial
  property :credentials, YAMLObject
end

最后但并非最不重要的一点是gemJson提供的类型,dm-types它使用 MultiJson 转储和加载数据。

参考资料(对象类型):

参考资料(定义自己的类型):

参考文献(Json 类型):

于 2013-02-19T19:29:11.330 回答
1

看起来您也可以使用本机 DataMapper 类型。

来自http://datamapper.org/docs/dm_more/types.html

序列化器

这些使用基于文本的序列化格式将值存储在数据存储中。它们通过调用将对象转储为保存和解析文本以在加载时重新初始化它们的格式来工作。

Csv
Json
Yaml

所以像

class MyModel
  include DataMapper::Resource

  property :id, Serial
  property :credentials, Json
end
于 2014-08-20T18:06:23.167 回答