gpt4 book ai didi

ruby - 将 #to_yaml 添加到 DataMapper 模型

转载 作者:太空宇宙 更新时间:2023-11-03 16:06:28 26 4
gpt4 key购买 nike

我正在使用 DataMapper 进行数据库访问。我的目标是将模型作为只读对象发送到网络服务。这是我目前的尝试:

class User
include DataMapper::Resource

def to_yaml(opts = {})
mini_me = OpenStruct.new
instance_variables.each do |var|
next if /^@_/ =~ var.to_s
mini_me.send("#{var.to_s.gsub(/^@/, '')}=", instance_variable_get(var))
end

mini_me.to_yaml(opts)
end

....
end

YAML::ENGINE.yamler = 'psych'

u = User.get("hulk")
p u.to_yaml
# => "--- !ruby/object:OpenStruct\ntable:\n :uid: hulk\n :uidNumber: 1000\n :gidNumber: 1001\n :email: hulk@example.com\n :dn: uid=hulk,ou=People,o=example\n :name: Hulk\n :displayName: Hulk\n :description: Hulk\n :homeDirectory: /home/hulk\n :accountFlags: ! '[U ]'\n :sambaSID: S-1-5-21-......\nmodifiable: true\n"

p [ u ].to_yaml # TypeError: can't dump anonymous class Class

关于如何使这项工作有效并消除异常的任何想法?

谢谢,克丽丝

最佳答案

使用 to_yaml is deprecated in Psych ,从我的测试来看,在这种情况下它似乎实际上被破坏了。

当您直接在您的对象上调用 to_yaml 时,您的方法将被调用并获得您期望的结果。当您在包含您的对象的数组上调用它时,Psych 对其进行序列化,但没有正确处理您的 to_yaml 方法,并最终退回到默认序列化。在您的情况下,这会导致尝试序列化导致错误的匿名类。

要解决此问题,您应该改用 encode_with 方法。如果序列化形式在生成的 yaml 中被标记为 OpenStruct 对象很重要,您可以使用 represent_object(第一个 nil 参数似乎没有被使用):

def encode_with(coder)
mini_me = OpenStruct.new
instance_variables.each do |var|
next if /^@_/ =~ var.to_s
mini_me.send("#{var.to_s.gsub(/^@/, '')}=", instance_variable_get(var))
end

coder.represent_object(nil, mini_me)
end

如果您只是为了方便而使用 OpenStruct,替代方案可能是这样的:

def encode_with(coder)
instance_variables.each do |var|
next if /^@_/ =~ var.to_s
coder[var.to_s.gsub(/^@/, '')]= instance_variable_get(var)
end
end

请注意 Datamapper has its own serializer plugin为模型提供 yaml 序列化,可能值得研究。

关于ruby - 将 #to_yaml 添加到 DataMapper 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12637559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com