gpt4 book ai didi

ruby - data_mapper、attr_accessor 和序列化仅序列化属性而不是 attr_accessor 属性

转载 作者:数据小太阳 更新时间:2023-10-29 08:51:25 28 4
gpt4 key购买 nike

我正在使用 data_mapper/sinatra 并尝试使用 attr_accessor 创建一些属性。以下示例代码:

require 'json'
class Person
include DataMapper::Resource

property :id, Serial
property :first_name, String
attr_accessor :last_name
end

ps = Person.new
ps.first_name = "Mike"
ps.last_name = "Smith"
p ps.to_json

产生这个输出:

"{\"id\":null,\"first_name\":\"Mike\"}"

显然,我希望它同时提供名字和姓氏属性。关于如何使它以人们期望的方式工作以便我的 json 具有所有属性的任何想法?

此外,请随时解释为什么我的期望(我会获得所有属性)是不正确的。我猜某些内部属性列表没有将 attr_accessor 实例变量添加到它或其他东西中。但即便如此,为什么?

最佳答案

Datamapper 有自己的序列化库, dm-serializer ,它提供了一个 to_json任何 Datamapper 资源的方法。如果您需要带 require 'data_mapper' 的 Datamapper在您的代码中,您使用的是 data_mapper meta-gemrequires dm-serializer as part of it’s set up .

to_json dm-serializer提供的方法仅序列化对象的 Datamapper 属性(即您使用 property 指定的属性)而不是“普通”属性(您使用 attr_accessor 定义的属性)。这就是为什么你得到 idfirst_name但不是 last_name .

为了避免使用dm-serializer你需要明确要求那些你需要的库,而不是依赖 data_mapper .您至少需要 dm-core也许还有其他人。

“正常”json库在默认 to_json 中不包含任何属性调用一个对象,它只使用对象 to_s方法。所以在这种情况下,如果您替换 require 'data_mapper'require 'dm-core' , 你会得到类似 "\"#<Person:0x000001013a0320>\"" 的东西.

要创建您自己的对象的 json 表示,您需要创建自己的 to_json方法。一个简单的例子就是在 json 中硬编码你想要的属性:

def to_json
{:id => id, :first_name => first_name, :last_name => last_name}.to_json
end

您可以创建一个方法来查看对象的属性和特性,并从中创建适当的 json,而不是通过这种方式对它们进行硬编码。

请注意,如果您创建自己的 to_json您仍然可以调用 require 'data_mapper' 的方法, 你的 to_json将替换 dm-serializer 提供的那个.事实上dm-serializer还添加了一个 as_json method您可以使用它来创建组合 to_json方法,例如:

def to_json
as_json.merge({:last_name => last_name}).to_json
end

关于ruby - data_mapper、attr_accessor 和序列化仅序列化属性而不是 attr_accessor 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12024298/

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