2017-05-16 5 views
1

Das ist mein ModellWie ein Sequel führen in JSON serialisiert

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

Als ich

Client.first.to_json 

ausführen ich

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

bekommen Aber wenn ich ausführen

DB[:clients].first.to_json 

ich richtig erhalten:

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

Was mache ich falsch ... Ich habe auch versucht Client.dataset.first.json mit dem gleichen Ergebnis mit.

auch eine MS Access DB Ich verwende, aber ich glaube nicht, das ist wichtig.

+0

Hast Du diesen irgendwo rumstehen: 'Sequel :: Model.plugin: json_serializer'. Wenn ja, was ist 'Client.first.class'? – Kris

+0

Ok, ich habe es einfach hinzugefügt und es hat sofort funktioniert, vielen Dank! – Mackaber

+0

Ich würde 'Client.first.to_h.to_json' versuchen. Ein Modell gibt eine Instanz dieser Klasse zurück, sodass Sie das Ergebnis in einen Hash konvertieren müssen. –

Antwort

0

Die json Bibliothek (Teil der Ruby-Standard-Bibliothek) und andere Edelsteine ​​wie Active, Affe Patch Objekte mit einem to_json Verfahren, das, was sein könnte, wird immer genannt , kein die spezifische to_json Methode von Sequel geliefert, die weiß, wie man eine Sequel::Model Instanz zu JSON konvertieren. Das ist Spekulation, wie ich wäre überrascht, dass die JSON-Bibliothek Affen Patches etwas anderes als String, Array, Hash usw.

Wenn DB[:clients].first verwenden Sie wahrscheinlich eine Hash zurück, die eine to_json Methode hat, wo als Client.first ein Modell zurückgibt Instanz, die nicht von der generischen to_json-Methode behandelt wird, die von der json-Bibliothek bereitgestellt wird.

Versuchen Sie, das Sequel JSON-Plugin registriert, sollte dies Vorrang vor dem Affen nehmen gepatcht to_json Methode:

Sequel::Model.plugin :json_serializer 

Durch die Möglichkeit, dies ist ein guter Indikator dafür, warum Affen Patchen ist oft eine schlechte Idee, vor allem Affen Patchen von Klassen, die sich außerhalb eines Namensraumes für Bibliotheken/Edelsteine ​​befinden.

1

Sie müssen to_hash verwenden:

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}" 
Verwandte Themen