我刚开始使用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是否已经为此提供了一种机制?
答案 0 :(得分:2)
您可以使用DataMapper提供的Object
类型:
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
最后但并非最不重要的是,Json
gem提供了dm-types
类型,它使用MultiJson转储和加载数据。
参考文献(对象类型):
引用(定义自己的类型):
参考文献(Json Type):
答案 1 :(得分: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