这是我的模特
class Client < Sequel::Model(:clients)
end
执行时
Client.first.to_json
我得到了
"\"#<Client:0x2594b824>\""
但是当我执行
时DB[:clients].first.to_json
我正确地得到了:
{id: 1, name: "Someone" ... }
我做错了什么?...我也尝试使用具有相同结果的Client.dataset.first.json
。
我也使用MS Access DB,但我认为这不重要。
答案 0 :(得分:2)
json
库(Ruby标准库的一部分)和其他宝石(如ActiveSupport),带有to_json
方法的猴子补丁对象可能是被调用的,而不是特定的{ Sequel提供的{1}}方法知道如何将to_json
实例转换为JSON。这是猜测,因为我对JSON库猴子补丁除了Sequel::Model
,String
,Array
等以外的其他内容感到惊讶。
使用Hash
时,您可能会返回DB[:clients].first
个Hash
方法,其中to_json
会返回一个模型实例,该实例不会被Client.first
处理json库提供的通用to_json
方法。
尝试注册Sequel JSON插件,这应该优先于猴子修补to_json
方法:
Sequel::Model.plugin :json_serializer
顺便说一下,这是一个很好的指标,说明为什么猴子修补通常是一个坏主意,特别是对库/ gems名称空间之外的类进行猴子修补。
答案 1 :(得分:1)
您需要使用to_hash
:
require 'json'
require 'sequel'
DB = Sequel.sqlite
DB.create_table :items do
primary_key :id
String :name
Float :price
end
items = DB[:items]
items.insert(:name => 'abc', :price => rand * 100)
class Item < Sequel::Model(:items)
end
Item.first
.to_hash # => {:id=>1, :name=>"abc", :price=>51.47074347440235}
.to_json # => "{\"id\":1,\"name\":\"abc\",\"price\":51.47074347440235}"