2017-05-16 2 views
1

Ceci est mon modèleComment sérialiser un Sequel résultat dans JSON

class Client < Sequel::Model(:clients) 
end 

Lorsque j'exécute

Client.first.to_json 

Je reçois

"\"#<Client:0x2594b824>\"" 

Mais quand j'execute

DB[:clients].first.to_json 

Je reçois correctement:

{id: 1, name: "Someone" ... } 

Qu'est-ce que je fais mal ... J'ai essayé également d'utiliser Client.dataset.first.json ayant le même résultat.

J'utilise également une base de données MS Access mais je ne pense pas que ce soit important.

+0

Avez-vous quelque part cela: 'Sequel :: Model.plugin: json_serializer'. Si oui, qu'est ce que Client.first.class'? – Kris

+0

Ok, je viens de l'ajouter et ça a fonctionné tout de suite, merci beaucoup! – Mackaber

+0

J'essaierais 'Client.first.to_h.to_json'. Un modèle renvoie une instance de cette classe, vous devez donc convertir le résultat en hash. –

Répondre

0

La bibliothèque json (partie de la bibliothèque standard Ruby), et d'autres pierres précieuses telles que ActiveSupport, objets patch singe avec une méthode to_json qui pourrait être ce que l'on s'appelle , pas une méthode spécifique to_json fournie par Sequel qui sait comment convertir une instance Sequel::Model en JSON. Ceci est la spéculation que je serais surpris que les patchs de singe bibliothèque JSON autre chose que String, Array, Hash etc.

Lorsque vous utilisez DB[:clients].first vous obtenez probablement un retour Hash qui a une méthode to_json, alors que Client.first retourne un modèle instance qui n'est pas gérée par la méthode générique to_json fournie par la bibliothèque json.

Essayez de vous enregistrer le plug-in Sequel JSON, cela devrait avoir préséance sur le singe patché to_json méthode:

Sequel::Model.plugin :json_serializer 

Par la façon dont c'est un bon indicateur de savoir pourquoi rapiéçage de singe est souvent une mauvaise idée, en particulier patching singe des classes qui sont en dehors d'un espace de noms bibliothèques/gems.

1

Vous devez utiliser 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}"